主要包括以下二大方面:
第一:採用stop方法來停止執行緒,會導致執行緒執行到一半突然停止,沒辦法完成乙個基本單位的操作,會造成髒讀資料,且會釋放監視鎖
suspend方法不會釋放鎖,容易造成死鎖
第二:volatile在生產者模式下會失效,執行緒長時間阻塞,就沒法停止執行緒
/**
* 描述: 演示用volatile的侷限part2 陷入阻塞時,volatile是無法執行緒的
此例中,生產者的生產速度很快,消費者消費速度慢,所以阻塞佇列滿了以後,生產者會阻塞,等待消費者進一步消費
*/public class wrongwayvolatilecantstop
system.out.println("消費者不需要更多資料了。");
//一旦消費不需要更多資料了,我們應該讓生產者也停下來,但是實際情況
producer.canceled=true;
system.out.println(producer.canceled);
}}class producer implements runnable
@override
public void run()
num++;
}} catch (interruptedexception e) finally
}}class consumer
public boolean needmorenums()
return true;
}}
程式的執行結果為執行緒一直在執行,沒有停止
修正:使用thread物件引用的interrupt()方法,並在run方法中使用thread.currentthread().isinterrupted(),
/**
* 描述: 用中斷來修復剛才的無盡等待問題
*/public class wrongwayvolatilefixed
system.out.println("消費者不需要更多資料了。");
producerthread.interrupt();//重點在這
class producer implements runnable
@override
public void run()
num++;
}} catch (interruptedexception e) finally }}
class consumer
public boolean needmorenums()
return true;}}
}
第三:
判斷執行緒是否已經被中斷的方法
**demo:
public class rightwayinterrupted
}});
// 啟動執行緒
threadone.start();
//設定中斷標誌
threadone.interrupt();
//獲取中斷標誌
system.out.println("isinterrupted: " + threadone.isinterrupted());
//獲取中斷標誌並重置
system.out.println("isinterrupted: " + threadone.interrupted());
//獲取中斷標誌並重直
system.out.println("isinterrupted: " + thread.interrupted());
//獲取中斷標誌
system.out.println("isinterrupted: " + threadone.isinterrupted());
threadone.join();
system.out.println("main thread is over.");
}}
執行結果為:
isinterrupted: true,當前執行緒已經給中斷訊號,所以能接收到中斷資訊
isinterrupted: false,所呼叫的方法為靜態的方法,該方法會清除中斷資訊,獲取不到
isinterrupted: false,此時該方法的目標物件是main執行緒,而main執行緒沒有誰來發中斷訊號,也就獲取不到中斷資訊了
isinterrupted: true,該方法不會清除中斷訊號,因此可以接收到
第四:1.如何停止執行緒?,可以分為以下情況來回答
原理,用interrupt來請求,好處
想停止執行緒,要請求方法,被停止方,子方法被呼叫的配合
最後再說錯誤的方法,:stop/suspend,volatile修飾的boolean無法處理長時間阻塞的情況
2.如何處理不可中斷的阻塞(reentrantlock,和io)?
針對不同的情況,採取不同的策略,並用能夠響應中斷的類,比如reentrantlock的lock方法,可以用其interrupted方法
停止多執行緒錯誤方法1
使用原有的停止方法,目前已經廢棄 stop suspend和resume 錯誤的停止方法 用stop 來停止執行緒,會導致執行緒執行一半突然停止,沒辦法完成乙個基本單位的操作 乙個連隊 會造成髒資料 多領取和少領取 public class stopthread implements runnabl...
執行緒之停止執行緒
停止執行緒有三種方法 1.建議正常停止 利用次數,不建議死迴圈 2.建議使用標誌位 設定乙個標誌位 3.不要使用stop或者destoy等過時或者jdk不建議使用的方法舉例說明 想讓乙個正在執行的程式停下來,執行其他程式,執行完以後再進行自己的程式 怎麼來解決呢?可以自己設定乙個標識位.在自己的程式...
執行緒的停止
執行緒停止 執行緒的停止 1.停止乙個執行緒 我們一般都會通過乙個變數去控制的。2.如果需要停止乙個處於等待狀態下的執行緒,那麼我們需要通過變數配合notify方法或者interrupt 來使用。public class threaddemo5 extends thread public synch...