1、stop被废弃的原因
其实stop方法天生就不安全,因为它在终止一个线程时会强制中断线程的执行,不管run方法是否执行完了,并且还会释放这个线程所持有的所有的锁对象。这一现象会被其它因为请求锁而阻塞的线程看到,使他们继续向下执行。这就会造成数据的不一致,我们还是拿银行转账作为例子,我们还是从A账户向B账户转账500元,我们之前讨论过,这一过程分为三步,第一步是从A账户中减去500元,假如到这时线程就被stop了,那么这个线程就会释放它所取得锁,然后其他的线程继续执行,这样A账户就莫名其妙的少了500元而B账户也没有收到钱。这就是stop方法的不安全性。
2、suspend被废弃的原因
suspend被弃用的原因是因为它会造成死锁。suspend方法和stop方法不一样,它不会破换对象和强制释放锁,相反它会一直保持对锁的占有,一直到其他的线程调用resume方法,它才能继续向下执行。
假如有A,B两个线程,A线程在获得某个锁之后被suspend阻塞,这时A不能继续执行,线程B在或者相同的锁之后才能调用resume方法将A唤醒,但是此时的锁被A占有,B不能继续执行,也就不能及时的唤醒A,此时A,B两个线程都不能继续向下执行而形成了死锁。这就是suspend被弃用的原因。
3、如何中断一个线程
(1)、自行决定线程何时退出
定义一个标记变量stopme,用于指示线程是否需要退出。当stopMe()被调用,代码检测到这个改动时,线程就退出了。
//线程内
volatile boolean stopme = false;
public void stopMe(){
stope = true;
}
@Override
public void run(){
while(true){
if(stopme){
System.out.println("exit by stop me");
break;
}
//你要执行的代码
}
}
//线程内
(2)、用线程中断
与方法一比中断的功能更强,比如在 wait()或sleep()中只能用中断。
//main方法内
volatile boolean stopme = false;
public void stopMe(){
stope = true;
}
Thread t1 = new Thread(){
@Override
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("interrupted");
break;
}
//你要执行的代码
...
}
}
};
t1.start();
Thread.sleep(2000);
t1.interrupt();
//main方法内