不提倡的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...