(五十四)终止线程的方法有哪些
一、stop() :存在读取数据不一致问题
stop方法过于暴力,会直接终止线程,并且立即释放这个线程所持有的锁,而这些锁是用来维持对象一致性的,如果此时,写线程写入的数据正写入一半,并强行终止,那么对象就会被写坏,同时由于锁已经被释放,另外一个等待该锁的读线程就顺利成章的读到了这个不一致的问题,而且这种问题很难被定位。
二、suspend():可能产生死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,如果无外力作用,他们都将无法推进
suspend()并不会释放锁,这就导致了一个问题:
线程A已经获取到了互斥资源M锁,此时线程A通过suspend()方法挂起线程A的执行,接着线程B也去访问互斥资源M,则造成死锁
以上一、二已经被废弃
三、优雅结束线程方式之让线程自动结束进入Dead状态
通过设置一个flag标记来控制
public class MyThread implements Runnable
{
private volatile boolean flag;
public void stop()
{
flag=false;
}
public void run()
{
while(flag)
;//do something
}
}
四、优雅结束线程方式之让interrupt()
用interrupt()方法,会抛出异常,然后在run()方法里捕获这个异常让线程安全退出
public class MyThread{
public void main(String[] args)
{
Thread thread=new Thread(new Runnable(){
public void run(){
syso("thread go to sleep");
try{
Thread.sleep(5000);
syso("thread finish");
}catch(InterruptedException e){
syso("thread is interrupt");
}
});
thread.start();
thread.interrupt();
}
}