正確中斷java執行緒

2021-04-13 07:30:58 字數 1193 閱讀 7478

不提倡的stop()方法

臭名昭著的stop()停止執行緒的方法已不提倡使用了,原因是什麼呢?

當在乙個執行緒物件上呼叫stop()方法時,這個執行緒物件所執行的執行緒就會立即停止,並丟擲特殊的threaddeath()異常。這裡的「立即」因為太「立即」了,

假如乙個執行緒正在執行:

synchronized void 

由於方法是同步的,多個執行緒訪問時總能保證x,y被同時賦值,而如果乙個執行緒正在執行到x = 3;時,被呼叫了 stop()方法,即使在同步塊中,它也乾脆地stop了,這樣就產生了不完整的殘廢資料。而多執行緒程式設計中最最基礎的條件要保證資料的完整性,所以請忘記 執行緒的stop方法,以後我們再也不要說「停止執行緒」了。

如何才能「結束」乙個執行緒?

interupt()中斷執行緒

乙個執行緒從執行到真正的結束,應該有三個階段:

正常執行.

處理結束前的工作,也就是準備結束.

結束退出.

那麼如何讓乙個執行緒結束呢?既然不能呼叫stop,可用的只的interrupt()方法。但interrupt()方法只是改變了執行緒的執行狀態,如何讓它退出執行?對於一般邏輯,只要執行緒狀態已經中斷,我們就可以讓它退出,這裡我們定義乙個執行緒類threada,所以這樣的語句可以保證執行緒在中斷後就能結束執行:

while(!isinterrupted())

,乙個測試類,threaddemo

這樣threaddemo呼叫interrupt()方法,isinterrupted()為true,就會退出執行。但是如果執行緒正在執行wait,sleep,join方法,你呼叫interrupt()方法,這個邏輯就不完全了。

我們可以這樣處理:

public void run()catch(interruptedexception e)}} 

}

想一想,如果乙個正在sleep的執行緒,在呼叫interrupt後,會如何?wait方法檢查到isinterrupted()為true,丟擲異常, 而你又沒有處理。而乙個丟擲了interruptedexception的執行緒的狀態馬上就會被置為非中斷狀態,如果catch語句沒有處理異常,則下一 次迴圈中isinterrupted()為false,執行緒會繼續執行,可能你n次丟擲異常,也無法讓執行緒停止。

這個錯誤情況的例項**

threada

threaddemo

正確的threada**是:

正確中斷java執行緒

不提倡的stop 方法 臭名昭著的stop 停止執行緒的方法已不提倡使用了,原因是什麼呢?當在乙個執行緒物件上呼叫stop 方法時,這個執行緒物件所執行的執行緒就會立即停止,並丟擲特殊的threaddeath 異常。這裡的 立即 因為太 立即 了,假如乙個執行緒正在執行 synchronized v...

Java 多執行緒 interrupt 中斷

當乙個執行緒執行時,另乙個執行緒可以呼叫對應的thread物件的interrupt 方法來中斷它,該方法只是在目標執行緒中設定乙個標誌,表示它已經被中斷,並立即返回。這裡需要注意的是,如果只是單純的呼叫interrupt 方法,執行緒並沒有實際被中斷,會繼續往下執行。created by yangt...

理解java執行緒的中斷 interrupt

public class thread3 extends thread else public static void main string args throws interruptedexception interrupted的經典使用 public void run catch interr...