前言
一般线程执行完 run 方法后,线程就正常结束了。但有时候 run 方法永远不会结束。因此,此时需要特殊处理,结束线程。
第一种方法
添加标志位
public class MyThread extends Thread {
public volatile boolea exit = false;
public void run() {
while (!exit) {
// do something
}
}
}
第二种方法
使用 stop 方法终止。不推荐使用,原因有三个:
- stop 方法已经被标识为过时方法;
- stop 方法终止,会发生不可预料的结果。比如运行一半,突然终止。会导致代码逻辑不完整,对结果不可预测;
- 会破坏锁的原子操作。假设线程中有锁,调用 stop 后,会将内部的所有锁释放,其他获取的原子操作数据,可能就是不准确的。
第三种方法
使用 interrupt 方法。interrupt 跟标志位方法很像,但是在阻塞状态也能退出来。
分两种情况,
第一种是线程未进入阻塞状态,调用 interrupt 后,中断标识为变成 true。中断标识为 while (!isInterrupted());
第二种就是阻塞状态调用 interrupt 后,线程中会抛出一个异常,捕获异常并跳出循环即可。
两者结合后,代码如下:
public class MyThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
网友评论