两阶段终止模式
什么是两阶段终止模式
- 核心:[实现正在运行的线程可以被其余线程优雅的终止]{.red}
细节:之前已经借助了中断方法实现了优雅的中断线程,现在将这种中断方式抽象成一种模式来实现
为什么要使用两阶段终止模式
情景:线程之间需要相互通信协作的时候,会出现某些线程想要终止其他线程的情况
方式:
stop()
方法前提:[Stop 方法在 JDK 中已经内废弃了]{.gray}
作用:[强制性杀死需要中断的线程,无论线程自身是否想要被终止]{.red}
缺陷:[被杀死的线程不会释放持有的资源的锁]{.aqua}
:::info
因为线程被杀死,所以它之后也没有机会再释放锁,其余线程也永远无法获取这把锁
:::
System.exit(1)
方法- 作用:[直接结束整个进程]{.red}
- 缺陷:[导致不想要被中断的线程也被一起中断,显然是非常不好的]{.aqua}
如何实现两阶段终止模式
步骤:
被监视的线程需要提供相应的开始和结束的方法:
抽象成类
// 设计模式: 两阶段终止模式
public class TwoPhaseTermination{
// 被监视的线程
private Thread monitor;
}实现开始和结束方法
// 设计模式: 两阶段终止模式
public class TwoPhaseTermination{
private Thread monitor;
// 启动线程的方法
private void start(){
monitor = new Thread(()->{
while (true){
if (monitor.isInterrupted())
break;
try {
TimeUnit.SECONDS.sleep(1);
log.debug("线程正常运行...");
}
catch (InterruptedException e) {
e.printStackTrace();
// 重新设置中断标记
monitor.interrupt();
}
}
});
monitor.start();
}
// 停止线程
private void stop(){
// 中断线程
monitor.interrupt();
}
}
监视线程只需要调用开始结束方法就可以很容易地控制该线程
// 设计模式: 两阶段终止模式
public class TwoPhaseTermination{
// 让线程一可以终止线程二的方式
public static void main(String[] args) throws InterruptedException
{
TwoPhaseTermination tpt = new TwoPhaseTermination();
tpt.start();
TimeUnit.SECONDS.sleep(5);
tpt.stop();
log.debug("线程运行结束...");
}
}