取消和關閉
中斷——一種協作機制,使線程能夠要求另一個線程停止當前工作。
7.1 任務取消
當外部代碼能夠在活動自然完成之前,把它改爲完成狀態,那個這個活動被稱爲可取消的。
7.1.1 中斷
線程中斷方法:
中斷並不會真正中斷一個正在運行的線程,它僅僅發出中斷請求,線程自己會在下一個方便的時刻中斷。
中斷是實現取消的最好選擇。
7.1.2 中斷策略
7.1.3 響應策略
7.1.5 通過Future取消
7.1.6 處理不可中斷阻塞
對於不可中斷阻塞,可以採取與中斷類似手段,來確保可以停止這些線程。
7.1.7用newTaskFor 封裝非標準取消
7.2 停止基於線程的服務
7.2.1 示例:日誌服務
日誌被分離到單獨的線程,構成生產者——消費者模式。
7.2.2 關閉ExecutorService
7.2.3 致命藥丸
另一種關閉生產者——消費者服務的方式是致命藥丸。
致命藥丸:一個可識別的對象,置於隊列中,當你得到它,就意味着停止工作。
7.2.4 只執行一次的服務
使用私有Executor:
7.2.3 shutdownNow的侷限性
7.3 處理反常的線程終止
7.3.1 未捕獲異常的處理
未捕獲的異常寫入日誌:
7.4 JVM關閉
JVM可以正常地關閉,也可以強行關閉。
7.4.1 關閉鉤子
7.4.2 精靈線程
7.4.3 Finalizer
避免使用Finalizer。