博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
1、什么是两阶段终止模式
两阶段终止模式(Two-Phase Termination Pattern)是一种软件设计模式,用于管理线程或进程的生命周期。它包括两个阶段:第一阶段是准备阶段,该阶段用于准备线程或进程的停止;第二阶段是停止阶段,该阶段用于执行实际的停止操作。这种模式的主要目的是确保线程或进程在停止之前完成必要的清理和资源释放操作,以避免出现资源泄漏和数据损坏等问题。两阶段终止模式是一种常见的并发编程模式,广泛应用于Java和其他编程语言中。
但是注意它不属于23个设计模式!!!
两阶段终止模式(Two-Phase Termination Pattern) 主打的就是优雅的退出!!!
2、两阶段终止模式有什么优缺点
两阶段终止模式(Two-Phase Termination)是一种用于优雅终止线程或关闭应用程序的设计模式。它包含两个阶段:准备阶段和终止阶段。
优点:
-
线程安全:两阶段终止模式可以确保在终止过程中不会发生并发问题,保证线程安全。
-
可控性:通过两个明确的阶段,可以更好地控制终止过程,确保在终止前完成必要的清理和资源释放操作。
-
可靠性:两阶段终止模式可以处理异常情况,即使在终止过程中出现异常,也能够正常地完成终止操作。
缺点:
-
延迟:由于需要等待准备阶段完成后才能进入终止阶段,可能会导致一定的延迟。
-
复杂性:相比直接终止线程或关闭应用程序,两阶段终止模式需要额外的设计和实现,增加了代码的复杂性。
-
需要协作:为了使两阶段终止模式正常工作,需要线程或应用程序的其他部分进行配合,可能需要引入额外的通信机制。
总的来说,两阶段终止模式在保证线程安全和可控性方面具有优势,但也会增加一定的延迟和复杂性。在设计和实现时需要权衡这些因素,并根据具体情况选择是否采用该模式。
3、两阶段终止模式应用场景
两阶段终止模式适用于以下场景:
-
线程终止:当需要终止一个线程时,可以使用两阶段终止模式。在准备阶段,线程可以完成一些必要的清理工作,如释放资源、关闭连接等。在终止阶段,线程可以安全地退出或终止执行。
-
应用程序关闭:当需要关闭一个应用程序时,可以使用两阶段终止模式。在准备阶段,应用程序可以完成一些必要的清理工作,如保存数据、关闭文件等。在终止阶段,应用程序可以正常地退出或关闭。
-
资源释放:当需要释放一些资源时,可以使用两阶段终止模式。在准备阶段,可以进行资源的释放前的准备工作,如保存状态、通知相关模块等。在终止阶段,可以安全地释放资源,确保不会造成资源泄漏或错误。
-
任务取消:当需要取消一个正在执行的任务时,可以使用两阶段终止模式。在准备阶段,可以进行一些必要的清理工作,如取消请求、释放锁等。在终止阶段,可以安全地终止任务的执行,确保不会产生副作用或错误。
总的来说,两阶段终止模式适用于需要优雅地终止线程或关闭应用程序,并确保在终止过程中完成必要的清理和资源释放操作的场景。
4、代码示例
这段代码实现了两阶段终止模式。在主函数中,创建了两个线程t1和t2,t1调用start方法启动一个监控线程,每隔1秒输出一条信息,t2在等待5秒后调用stop方法停止监控线程。start方法会创建一个新的线程monitorThread,该线程会在while循环中不断检查stopFlag的值,如果为false,则继续循环输出信息;如果为true,则跳出循环,输出停止信息。stop方法会将stopFlag设为true,并调用monitorThread的interrupt方法发送中断信号。
package com.pany.camp.thread.model;
import cn.hutool.core.thread.ThreadUtil;
public class TwoPhaseTermination {
private Thread monitorThread;
private boolean stopFlag;
public void start(String threadName) {
stopFlag = false;
monitorThread = new Thread(() -> {
while (!stopFlag) {
try {
Thread.sleep(1000);
System.out.println(threadName + "监控线程正在运行...");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println(threadName + "监控线程收到终止信号,继续完成剩余工作!");
}
}
System.out.println(threadName + "监控线程已经停止.");
});
monitorThread.start();
}
public void stop(String threadName) {
System.out.println(threadName + "发出停止信号");
stopFlag = true;
monitorThread.interrupt();
}
public static void main(String[] args) {
TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
Thread t1 = new Thread(() -> {
twoPhaseTermination.start("t1");
});
Thread t2 = new Thread(() -> {
ThreadUtil.sleep(5000);
twoPhaseTermination.stop("t2线程");
});
t1.start();
t2.start();
}
}
💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊