在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;