Java并发编程-两阶段终止模式
目录名称
Two Phase Termination
在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。
错误思路
- 使用线程对象的 stop() 方法停止线程,该方法已被废弃
stop 方***真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁
- 使用 System.exit(int) 方法停止线程
目的仅是停止一个线程,但这种做***让整个程序都停止(整个java程序都会停止)
模式详解
public class Test01 {
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
twoPhaseTermination.start();
Thread.sleep(4000);
//优雅的停止
twoPhaseTermination.stop();
}
}
class TwoPhaseTermination {
//创建一个监控线程
private Thread monitor;
//启动监控线程
public void start() {
monitor = new Thread(() -> {
while (true) {
//拿到当前线程
Thread current = Thread.currentThread();
//监控是否被打断
if (current.isInterrupted()) {
System.out.println("料理后事");
break;
}
try {
Thread.sleep(1000); //睡眠中
//如果没有被打断,执行监控操作
System.out.println("执行监控操作"); //操作中
} catch (InterruptedException e) {
e.printStackTrace();
//在睡眠中被打断会进入到这里
//补充睡眠中被打断,线程的打断标记会置为false,所以需要设置打断标记
//再次循环监控的时候就会break
current.interrupt();
}
}
});
monitor.start();
}
//停止监控线程
public void stop() {
monitor.interrupt();
}
}
不推荐使用方法
stop() 停止线程运行
suspend() 挂起(暂停)线程运行
resume() 恢复线程运行