使用退出標誌,使執行緒正常退出,也就是讓run()方法執行完成後停止
使用stop方法強行終止執行緒,但是不推薦使用這個方法,因為stop是作廢過期的方法,使用它可能產生不可預料的結果
使用interrupt方法中斷執行緒
package chapter1;
public class mythread extends thread
} public static void main(string args) throws interruptedexception
}
控制台輸出如下,可以看到在主線程中修改標記的值,使while迴圈停止,可以讓執行緒t正常退出,推薦使用這種方法
184908
184909
184910
184911
184912
184913
184914
184915
main end
package chapter1;
public class mythread extends thread
} public static void main(string args) throws interruptedexception
}
執行main方法,可以在控制台看到如下輸出,也可以完成執行緒的停止。
181458
181459
181460
181461
181462
181463
181464
181465
181466
181467
main end
既然stop方法可以完成執行緒的停止,為什麼jdk要廢棄掉這個方法,不建議使用呢?我們看一下下面這個例子:
首先建立乙個使用者類,裡面有乙個同步方法updateuser,為了便於觀察,模擬程式的執行時間,在兩次set中間休眠了1秒
package chapter1;
public class user
public void setusername(string username)
public string getpassword()
public void setpassword(string password)
public user(string username, string password)
synchronized public void updateuser(string u,string p) catch (interruptedexception e) }
}
接下來在主線程中我們執行0.5秒以後使用stop方法強制停止這個執行緒,觀察執行結果
package chapter1;
public class mythread extends thread
@override
public void run()
public static void main(string args) throws interruptedexception
}
控制台輸出結果如下:
username:b password:aa
使用stop方法會強制停止執行緒,不管當前執行緒在幹什麼都會被停止,使用stop暴力釋放鎖可能會導致資料不一致的問題。
interrupt方法並不會真的停止執行緒,只是對執行緒做乙個標記,標記這個執行緒被中斷了,所以需要和return或者拋異常的方法結合來使用。
package chapter1;
public class mythread extends thread
}} catch (exception e)
} public static void main(string args) catch (interruptedexception e)
}}
其實第一種和第三種方式是類似的,都是通過標記判斷執行緒是否終止,然後使用return 或者throw a exception的方式來結束執行緒的執行,只不過interrupt不需要我們來定義標記。第二種方式使用stop方法太過於暴力,如果程式在執行一些很關鍵的操作,被強行終止,可能會發現意向不到的結果,最好還是不要使用。 《java多執行緒程式設計核心技術》核心筆記 一
執行緒具有優先順序 執行緒的優先順序具有繼承特性。被呼叫者繼承呼叫者的優先順序 優先順序高的執行緒 絕大部分會現執行 方法內的變數是執行緒安全的。多個執行緒訪問同乙個物件的同步方法時,一定是執行緒安全的。synchronized取得的是物件鎖 多個執行緒訪問乙個物件 synchronized 如果乙...
Java多執行緒 程式設計核心技術4Lock
執行緒間同步互斥,且嗅探鎖定 多路分支通知,使用上較synchronized靈活 呼叫該物件的lock 獲取鎖,unlock 釋放鎖 借助condition實現等待 通知模式 condition 物件監視器 是jdk5 靈活性 多路通知 乙個lock物件中建多個condition例項,執行緒物件可以...
Java多執行緒 程式設計核心技術5 Lock
1 計畫時間早於當前時間,提前執行 2 timertask類的cancel 方法 將自身從任務佇列中清除 3 timer類的cancel方法 清空任務佇列的全部任務 如果該方法沒有搶到鎖,任務還是繼續執行 4 schedule timertask task long delay,long perio...