如何"優雅"地終止一個執行緒?

茅坤寶駿氹發表於2018-05-03

轉載自 如何"優雅"地終止一個執行緒?

我們的系統肯定有些執行緒為了保證業務需要是要常駐後臺的,一般它們不會自己終止,需要我們通過手動來終止它們。我們知道啟動一個執行緒是start方法,自然有一個對應的終止執行緒的stop方法,通過stop方法可以很快速、方便地終止一個執行緒,我們來看看stop的原始碼。



通過註解@Deprecated看出stop方法被標為廢棄的方法,jdk在以後的版本中可能被移除,不建議大家使用這種API。


那為什麼這麼好的一個方法怎麼不推薦使用,還要標註為廢棄呢?


假設有這樣的一個業務場景,一個執行緒正在處理一個複雜的業務流程,突然間執行緒被呼叫stop而意外終止,這個業務資料還有可能是一致的嗎?這樣是肯定會出問題的,stop會釋放鎖並強制終止執行緒,造成執行一半的執行緒終止,帶來的後果也是可想而知的,這就是為什麼jdk不推薦使用stop終止執行緒的方法的原因,因為它很暴力會帶來資料不一致性的問題。


正因為stop方法太過暴力,所以一般不推薦使用,除非你非常清楚你自己的業務場景,用stop終止不會給你的業務帶來影響。


說了這麼多,那如何優雅地終止一個執行緒呢?看看下面的程式。



其實也不難,只需要新增一個變數,判斷這個變數在某個值的時候就退出迴圈,這時候每個迴圈為一個整合不被強行終止就不會影響單個業務的執行結果。


相關文章