在java doc裏面可以看到stop suspend 已經被deprecated了。
因爲stop會造成unsafe,而suspend會造成死鎖。
那我們要怎麼讓一個線程stop。我們需要提供一個變量,以及一個用來設置這個變量的函數。如:
class Test extends Thread{
private boolean stop;
public void stopThread(){
stop = true;
}
public void run(){
while (!stop){
//do work
}
//clean up
}
}
這個方法的缺點是:
線程的終止有可能不情願地推遲,當一個線程對另一個線程的調用stopThread, 線程2可能正在它的while循環內部進行一些任務,就不會及時查看它的stop變量。這項技術也有優點,線程還會繼續執行,所以就能到達clean up,也就能進行寫必要的清理工作了。
但是上述代碼並不完全正確,問題在stop身上。當我們把stop變量設置爲true,並不能保證run()內的代碼看的見變化了的值,之所以存在這個問題是因爲java允許線程在其私有專用內存中保留主內存的變量副本。這可以優化性能。在訪問變量時,對私有內存的超作,性能大於主內存。
有兩種方法可用確保變量的私有專用副本與其主內存內的版本一致:
1。在synchronized函數或synchronized區塊中進行訪問。
2。聲明變量爲volatile。
將變量聲明爲volatile,可迫使java運行層在每次訪問變量時都對私有專用副本和主內存之間進行一致化。聲明stop爲volatile可以確保其值是最新的。
private volatile boolean stop;