日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

thread java 关闭_怎么在java中关闭一个thread

發布時間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 thread java 关闭_怎么在java中关闭一个thread 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

怎么在java中關閉一個thread

我們經常需要在java中用到thread,我們知道thread有一個start()方法可以開啟一個線程。那么怎么關閉這個線程呢?

有人會說可以用Thread.stop()方法。但是這個方法已經被廢棄了。

根據Oracle的官方文檔,Thread.stop是不安全的。因為調用stop方法的時候,將會釋放它獲取的所有監視器鎖(通過傳遞ThreadDeath異常實現)。如果有資源該監視器鎖所保護的話,就可能會出現數據不一致的異常。并且這種異常很難被發現。 所以現在已經不推薦是用Thread.stop方法了。

那我們還有兩種方式來關閉一個Thread。

Flag變量

如果我們有一個無法自動停止的Thread,我們可以創建一個條件變量,通過不斷判斷該變量的值,來決定是否結束該線程的運行。

public class KillThread implements Runnable {

private Thread worker;

private final AtomicBoolean running = new AtomicBoolean(false);

private int interval;

public KillThread(int sleepInterval) {

interval = sleepInterval;

}

public void start() {

worker = new Thread(this);

worker.start();

}

public void stop() {

running.set(false);

}

public void run() {

running.set(true);

while (running.get()) {

try {

Thread.sleep(interval);

} catch (InterruptedException e){

Thread.currentThread().interrupt();

log.info("Thread was interrupted, Failed to complete operation");

}

// do something here

}

log.info("finished");

}

public static void main(String[] args) {

KillThread killThread= new KillThread(1000);

killThread.start();

killThread.stop();

}

}

上面的例子中,我們通過定義一個AtomicBoolean 的原子變量來存儲Flag標志。

我們將會在后面的文章中詳細的講解原子變量。

調用interrupt()方法

通過調用interrupt()方法,將會中斷正在等待的線程,并拋出InterruptedException異常。

根據Oracle的說明,如果你想自己處理這個異常的話,需要reasserts出去,注意,這里是reasserts而不是rethrows,因為有些情況下,無法rethrow這個異常,我們需要這樣做:

Thread.currentThread().interrupt();

這將會reasserts InterruptedException異常。

看下我們第二種方法怎么調用:

public class KillThread implements Runnable {

private Thread worker;

private final AtomicBoolean running = new AtomicBoolean(false);

private int interval;

public KillThread(int sleepInterval) {

interval = sleepInterval;

}

public void start() {

worker = new Thread(this);

worker.start();

}

public void interrupt() {

running.set(false);

worker.interrupt();

}

public void stop() {

running.set(false);

}

public void run() {

running.set(true);

while (running.get()) {

try {

Thread.sleep(interval);

} catch (InterruptedException e){

Thread.currentThread().interrupt();

log.info("Thread was interrupted, Failed to complete operation");

}

// do something here

}

log.info("finished");

}

public static void main(String[] args) {

KillThread killThread= new KillThread(1000);

killThread.start();

killThread.interrupt();

}

}

上面的例子中,當線程在Sleep中時,調用了interrupt方法,sleep會退出,并且拋出InterruptedException異常。

總結

以上是生活随笔為你收集整理的thread java 关闭_怎么在java中关闭一个thread的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。