執行緒退出有多種方法,我們先來演示執行緒.stop()方法,此方法用於強制結束乙個執行緒
threadobj.
stop()
;
我們現在來看一下示例**:
上面方法分別使變數i和變數j分別間隔100毫秒後自增,並且輸出對應的值,可以看到,現成正常退出!
但是我們翻看**可以發現,stop()方法已經被標為過時,並不推薦使用,因為stop()方法是強制退出執行緒,並不保證所有必要邏輯執行完全,容易出現不可預料的錯誤:
既然強制退出執行緒容易導致安全問題,那麼我們就需要另一種新的方法,在需要執行緒需要退出時加上標記,然後用自己的邏輯手動的退出執行緒。
threadobj.
interrupt()
;//將當前執行緒標記為退出狀態
thread.
currentthread()
.isinterrupted()
//判斷當前執行緒是否已在停止狀態
注意:呼叫此方法後並不會立即停止執行緒,此方法只是將此執行緒標記為退出狀態,需要配合手動判斷退出執行緒!
可以看到,這裡就可以在所有業務執行完後安全的退出執行緒。
如果我們在上方**中,新增了thread.sleep()方法,就會發現如下異常:
這是因為執行緒在休眠時,被設定為中斷狀態,所以觸發了此異常,並且將執行緒中斷狀態設定為false。所以一定要在此處加上異常處理邏輯,確保執行緒安全退出。
這就導致執行緒可以正常執行,並且之後的isinterrupted()退出執行緒方法不生效。
那麼如何正確的面對此異常呢?
while
(true
)catch
(exception ex)
j++; system.err.
println
("j:"
+ j)
; system.err.
println
(thread.
currentthread()
.isinterrupted());}
while
(true
)catch
(exception ex)
j++; system.err.
println
("j:"
+ j);if
(thread.
currentthread()
.isinterrupted()
)}
while
(true
)catch
(exception ex)
j++; system.err.
println
("j:"
+ j);if
(thread.
currentthread()
.isinterrupted()
)}
總的來說,如果可以避免,不使用執行緒休眠的方法,如果使用,則需要在保證邏輯安全的前提下使用,並正確的處理異常,退出執行緒! Linux下如何安全退出執行緒
最近發現以前工作中寫的 有個比較嚴重的bug,在這裡做一下筆記,並做適當擴充套件,防止以後出現類似的問題。有兩種方法可以設定執行緒為分離執行緒,分別是建立時設定執行緒屬性和呼叫pthread detach.下面分別來介紹這兩種方法。建立執行緒時,可以通過pthread create的第二個引數傳遞執...
pthread cancel 完美退出執行緒
pthread cancel 完美退出執行緒 程式 include include include include void cleanup void void test pthread void pthread cleanup pop 0 return null int main sleep 1 ...
多執行緒退出
多執行緒退出,有兩種安全的退出方法。呼叫waitforsingleobject。必須在同乙個執行緒,否則會造成阻塞。例子如下 m pthreadrec afxbeginthread thread tcpserverreceive,this uint thread tcpserverreceive l...