Java线程两阶段终止模式
主要目的是安全的优雅的停止线程,因为Thread中的stop非常的暴力不安全,因为它会不管线程执行到哪里,都会马上停止,不能保证安全的结束。
interrupt和isInterrupted
interrupt和isInterrupted在上面文章有详细的说明
java多线程(4)–interrupt()、interrupted()和isInterrupted()
这里简单说一下 interrupt 能给线程打上一个中断标记true
( 当线程处于睡眠阻塞状态时会失败并报出会InterruptedException
),isInterrupted方法能去获取这个标记 返回true
或者false
既然我们能打上标识,获取标识那么我们就可以在线程中做判断 如果标识为true就停止当前线程
public class Test1 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
// 启动线程
myThread.start();
// 等待5秒
TimeUnit.SECONDS.sleep(5);
// 停止线程
myThread.stop();
}
}
class MyThread {
private Thread t1;
void start() {
t1 = new Thread(() -> {
while (true) {
try {
boolean isInterrupted = Thread.currentThread().isInterrupted();
if (isInterrupted) {
// 这里可以做很多 线程停止前的操作
log.debug("线程停止!!!!");
break;
}
log.debug("线程运行中");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
/* 如果线程处于等待状态 调用 t1.interrupt() 会
InterruptedException 异常 把打断标识重置为 false*/
e.printStackTrace();
// 重新调用interrupt打上停止断点
Thread.currentThread().interrupt();
}
}
}, "t1线程");
t1.start();
}
void stop() {
t1.interrupt();
log.debug("~~~开始停止线程~~~");
}
}
我们通过interrupt打上中断标识,isInterrupted获取标识就安全的把线程停下来了