怎么在java中关闭一个thread
怎么在java中關(guān)閉一個thread
我們經(jīng)常需要在java中用到thread,我們知道thread有一個start()方法可以開啟一個線程。那么怎么關(guān)閉這個線程呢?
有人會說可以用Thread.stop()方法。但是這個方法已經(jīng)被廢棄了。
根據(jù)Oracle的官方文檔,Thread.stop是不安全的。因為調(diào)用stop方法的時候,將會釋放它獲取的所有監(jiān)視器鎖(通過傳遞ThreadDeath異常實現(xiàn))。如果有資源該監(jiān)視器鎖所保護(hù)的話,就可能會出現(xiàn)數(shù)據(jù)不一致的異常。并且這種異常很難被發(fā)現(xiàn)。 所以現(xiàn)在已經(jīng)不推薦是用Thread.stop方法了。
那我們還有兩種方式來關(guān)閉一個Thread。
如果我們有一個無法自動停止的Thread,我們可以創(chuàng)建一個條件變量,通過不斷判斷該變量的值,來決定是否結(jié)束該線程的運行。
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標(biāo)志。
我們將會在后面的文章中詳細(xì)的講解原子變量。
通過調(diào)用interrupt()方法,將會中斷正在等待的線程,并拋出InterruptedException異常。
根據(jù)Oracle的說明,如果你想自己處理這個異常的話,需要reasserts出去,注意,這里是reasserts而不是rethrows,因為有些情況下,無法rethrow這個異常,我們需要這樣做:
Thread.currentThread().interrupt();這將會reasserts InterruptedException異常。
看下我們第二種方法怎么調(diào)用:
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();} }上面的例子中,當(dāng)線程在Sleep中時,調(diào)用了interrupt方法,sleep會退出,并且拋出InterruptedException異常。
本文的例子請參考https://github.com/ddean2009/learn-java-concurrency/tree/master/kill-thread
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
更多教程請參考 flydean的博客
總結(jié)
以上是生活随笔為你收集整理的怎么在java中关闭一个thread的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中join的使用
- 下一篇: java中的Atomic类