如何優雅的關閉java線程


轉載Fromjava 優雅的終止線程
Java中原來在Thread中提供了stop()方法來終止線程,但這個方法是不安全的,所以一般不建議使用。《Java多線程模式》中有一種叫Two-Phase Termination(兩步終止)的模式可以優雅的終止線程。

首先在線程中設置一個標志位:

private volatile boolean shutdownRequested = false;

然后在運行函數里,以這個標志位來判斷是否執行操作:

public final void run() {

    try {

        while (!shutdownRequested) {

            doWork();

        }

    } catch (InterruptedException e) {

    } finally {

        doShutdown();

    }

}

然后提供shutdown()接口供外部調用:

public final void shutdownRequest() {

    shutdownRequested = true;

    interrupt();

}

客戶可以這樣子使用:

thread.shutdown()

thread.join()

這個模式中采用了兩個步驟來終止線程,所以叫兩步終止模式。第一步,先將執行標志位shutdownRequested 設為false,是作業中的線程轉變為終止處理中的狀態,第二部才是真正去執行終止操作。這樣的做法可以保證線程的安全性、生命性和響應性。

  1. 安全性:不會在線程正在執行關鍵區域--Critical Section的時候突然結束掉

  2. 生命性:一定會進行終止處理,shutdown()中,會調用interrupt(),保證即使線程處於sleep或wait狀態也可以被立即終止,而客戶端調用shutdown()之后,會調用join()(用來等待線程關閉),保證了這個線程會執行完,也就確保了終止操作doshutdown()一定會執行

  3. 響應性:將shutdownRequested 設為volatile ,能保證線程收到終止請求后,會盡快開始終止處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM