多執行緒學習筆記 安全退出執行緒

2021-10-07 21:57:25 字數 2748 閱讀 4952

執行緒退出有多種方法,我們先來演示執行緒.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...