前面两节学习了启动一个线程以及线程的主要API,这一节主要介绍如何停止一个线程。
** 强烈建议不要使用线程的stop方法粗鲁的停止线程,因为stop方法会导致很多问题,例如:线程正在执行某个重要的不可中断的原子性操作,会导致数据的不一致;更重要的一点stop方法,可能不会释放mointor锁。
- 正常的停止,当一个线程完成逻辑处理之后,自动退出。
- 捕获外部传入中断信号(interrupt)信号;
- 在逻辑中判断 isInterrupted,来决定线程是否退出
- 在逻辑中有可中断的方法,处理InterruptException来终止。
- 使用volatile开关控制,这里思考一下我们为什么要使用volatile修饰开关,
public class VolatileSwitch extends Thread{
private volatile boolean close;
public void run() {
while (!close && !isInterrupted()){
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("interrupted");
}
}
}
public void close(){
this.close = true;
interrupt();
}
}
- 异常退出,Thread和Runnable的run方法都不能抛出任何Exception,但是我们可以抛出RunnableException停止线程。
网友评论