Java中原來在Thread中提供了stop()方法來終止線程,但這個方法是不安全的,所以一般不建議使用。文本將介紹兩種可以優雅的終止線程的方式…
第一種
在JAVA《Java多線程模式》中有一種叫Two-Phase Termination(兩步終止)的模式可以優雅的終止線程,這種模式採用了兩個步驟來終止線程,所以叫兩步終止模式。
先將執行標誌位isShutdown 設爲false,使工作中的線程轉變爲終止處理中的狀態
真正去執行終止操作,這樣的做法可以保證線程的安全性、生命性和響應性。
運行日誌
安全性:不會在線程正在執行關鍵區域--Critical Section的時候突然結束掉
生命性:一定會進行終止處理,shutdown()中,會調用interrupt(),保證即使線程處於sleep或wait狀態也可以被立即終止
響應性:將isShutdown 設爲volatile ,能保證線程收到終止請求後,會盡快開始終止處理。
存在的問題:針對沒有阻塞的情況:設置標誌變量,讓線程正常自然死亡,和諧!,但是如果在調用shutdown發生阻塞情況呢?
第二種
在 《多線程第一章》的時候,介紹過守護線程的作用,那麼是不是可以通過開啓守護線程的方式去監聽
功能
1.當工作結束就關閉主線程(主線程銷燬守護線程也會跟着一同銷燬)
2.如果任務長時間未完成,停止工作任務,減少開銷
編碼
1.定義主線程與發送的指令
2.在主線程run方法中創建一個守護線程,用來執行我們投遞的任務
3.前面已經介紹過join的功能,它可以阻塞主線程,等待子線程完成後主線程繼續執行
4.如果join釋放後,發送完成指令
5.創建listener(long mills),監聽工作情況
6.監聽任務是否完成,如果未完成監聽當前是否逾期,逾期打斷線程結束監聽
7.測試
listener(4 * 1000) 的運行日誌,當任務完成會直接退出,並不會一直佔用
listener(2 * 1000) 的運行日誌,當任務超時直接打斷線程,減少資源佔用
好了,今天的話題到這裏就結束了!