轉載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,是作業中的線程轉變為終止處理中的狀態,第二部才是真正去執行終止操作。這樣的做法可以保證線程的安全性、生命性和響應性。
-
安全性:不會在線程正在執行關鍵區域--Critical Section的時候突然結束掉
-
生命性:一定會進行終止處理,
shutdown()
中,會調用interrupt()
,保證即使線程處於sleep或wait狀態也可以被立即終止,而客戶端調用shutdown()
之后,會調用join()
(用來等待線程關閉),保證了這個線程會執行完,也就確保了終止操作doshutdown()
一定會執行 -
響應性:將shutdownRequested 設為volatile ,能保證線程收到終止請求后,會盡快開始終止處理。