tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。
介绍
两阶段终止模式(Two-Phase Termination Pattern)是一种软件设计模式,用于管理线程或进程的生命周期。它包括两个阶段:第一阶段是准备阶段,该阶段用于准备线程或进程的停止;第二阶段是停止阶段,该阶段用于执行实际的停止操作。这种模式的主要目的是确保线程或进程在停止之前完成必要的清理和资源释放操作,以避免出现资源泄漏和数据损坏等问题。两阶段终止模式是一种常见的并发编程模式,广泛应用于Java和其他编程语言中。
但是注意它不属于23个设计模式!!!
两阶段终止模式(Two-Phase Termination Pattern) 主打的就是优雅的退出!!!
代码示例
这段代码实现了两阶段终止模式。在主函数中,创建了两个线程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();
}
}