前言
在这里简单的介绍一下 > 两阶段终止模式 ,如何优雅的结束一个线程
一、具体操作请看下面代码
1.代码如下(示例):
public class TestInterrupt {
public static void main(String[] args) throws Exception {
TwoPhaseTerModel twoPhaseTerModel = new TwoPhaseTerModel();
twoPhaseTerModel.start();
TimeUnit.SECONDS.sleep(6);
//两阶段终止模式 - 第一段
twoPhaseTerModel.stop();
}
}
class TwoPhaseTerModel {
private Thread monitor;
public void start() {
monitor = new Thread() {
@Override
public void run() {
while (true) {
try {
if (isInterrupted()) {
//可以在这里面做一些最后的释放操作
System.out.println("优雅的打断终止线程");
break;
}
//打断的情况
//情况1:在此处打断,打断状态为true,下次循环的时候直接进入 [优雅的打断]并结束当前线程
System.out.println("监控中ing...");
//情况2:在sleep状态下打断,则抛出打断异常,异常中第二次调用 interrupt 重新打断,将打断状态标记为true
//下次循环的时候直接进入 [优雅的打断]并结束当前线程
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
//重新打断将打断标记为true,在进入到下次循环的时候就会[优雅的打断]
//两阶段终止模式 - 第二段
interrupt();
e.printStackTrace();
}
}
}
};
monitor.start();
}
public void stop() {
//打断线程
monitor.interrupt();
}
}
总结
提示:
两阶段终止模式 优雅的停止线程
isInterrupted 不会重新标记打断状态
Interrupted 会重新将打断状态标记为 false