结束线程的不好方式
调用线程的stop()方法,这个方法会直接结束线程,不给现程处理后事的机会。并且杀死线程后,线程的锁资源会立即释放,会导致数据不一致。
使用System.exit()方法,这个方法会直接停止整个程序
我们可以使用interrupt()方法,实现两阶段终止。
interrupt()方法
给线程发送一个中断通知
当线程正在执行中时,调用线程的interrupt()方法,会设置线程的中断标志位true,调用isInterrupted()返回true
当线程处于sleep、wait、调用了其他线程的join在阻塞等待时(阻塞状态),调用线程的interrupt()方法会让线程立即停止阻塞,并报InterruptedException,
并且会清除中断标志。调用isInterrupted()返回false
调用interrupt()方法本身并不会终止线程,只是给线程发送一个信息,告知线程有人希望你终止。
两阶段终止模式
public class TwoPhraseInterrupt {
public static void main(String[] args) throws InterruptedException {
Task task = new Task();
task.start();
Thread.sleep(2000);
task.stop();
}
}
class Task {
private Thread task;
public void start() {
task = new Thread(() -> {
while (true) {
// 判断线程是否要结束
Thread current = Thread.currentThread();
if (current.isInterrupted()) {
// 执行线程结束前要做的的工作
break;
}
try {
// 执行任务,每隔0.5秒执行一次
System.out.println("working");
current.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
// 线程在sleep时被打断,重新设置打断状态
System.out.println("task end");
current.interrupt();
}
}
});
task.start();
}
public void stop() {
task.interrupt();
}
}