java停止執行緒的幾種方式
阿新 • • 發佈:2019-02-19
該學習筆記是學習《java多執行緒程式設計核心技術》高洪巖版本的第一章的學習筆記,在該章節中個人認為比較重要的是如何正確的停止一個執行緒。
停止一個執行緒最重要的是讓執行緒的run方法結束執行於是可以有以下幾種方法:
1.run方法結束完成,則執行緒自然結束
2.retrun將方法返回,則方法自然結束
3.異常將方法中斷掉,這也就是書上所說的異常法
4.使用執行緒的stop方法
第一種方式自然不要多說
第二種方式做的demo,書上說使用多個return會造成汙染
Thread thread = new Thread(()->{
for (int i = 0; i < 50000; i++) {
System.out.println(Thread.currentThread().getName() + "執行到第" + i + "次。");
if(Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread().isInterrupted());
return ;
}
}
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
第三種方式是異常法Demo如下
Thread thread = new Thread(()->{
try{
for (int i = 0; i < 50000; i++) {
System.out.println(Thread.currentThread().getName() + "執行到" + i + "次。");
if(Thread.currentThread().isInterrupted()){
System.out.println("執行到這裡結束");
throw new RuntimeException("結束終止");
}
}
}catch (Exception e) {
System.out.println("捕獲異常,執行緒停止");
}
});
thread.start();
Thread.currentThread().sleep(1000);
thread.interrupt();
第四種是stop方式demo如下,stop方法已被作廢,其原因是有二,其一為stop方法會使一些清理工作得不到完成(?不明白)其二stop方法會釋放鎖,比如執行緒在執行一個同步方法,stop會將執行緒停止並釋放鎖,這是不安全的,應該將資料恢復後停止執行緒
Thread thread = new Thread(()->{
while(true){
System.out.println("aaa");
}
},"我的執行緒");
thread.start();
thread.sleep(1000);
thread.stop();
其他還有suspend暫停一個執行緒resume啟動一個執行緒,suspend方法會給同步方法加鎖也就是說執行緒在執行一個同步方法是被suspend會給同步方法上鎖,細節:println是一個同步方法
suspend和resume也會導致跟stop一樣的情況這也是為啥被棄用的原因
yield方法當前執行緒放棄執行讓其他執行緒執行,放棄時間不確定
setpriority設定執行緒優先,優先與執行結果不存在必然聯絡,這只是概率的問題
setdaemon設定是否為守護執行緒,也就是設定執行緒伴隨set他的執行緒而存活
有不對的地方忘改正