入門者如何在學習Java過程優雅關閉線程!

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) 的運行日誌,當任務超時直接打斷線程,減少資源佔用

好了,今天的話題到這裏就結束了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章