线程之两阶段终止模式(Two-Phase Termination Patter)模式

简介: 两阶段终止模式(Two-Phase Termination Pattern)是一种软件设计模式,用于管理线程或进程的生命周期。它包括两个阶段:第一阶段是准备阶段,该阶段用于准备线程或进程的停止;第二阶段是停止阶段,该阶段用于执行实际的停止操作。这种模式的主要目的是确保线程或进程在停止之前完成必要的清理和资源释放操作,以避免出现资源泄漏和数据损坏等问题。两阶段终止模式是一种常见的并发编程模式,广泛应用于Java和其他编程语言中。

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();

    }
}

image.png

目录
相关文章
|
6月前
|
存储 缓存 Java
9.队列:生产消费模式及线程池的运用
9.队列:生产消费模式及线程池的运用
60 0
|
6月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
70 1
|
3月前
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
|
3月前
|
NoSQL 关系型数据库 MySQL
简述redis的单线程模式
简述redis的单线程模式
|
4月前
|
Prometheus 监控 数据可视化
通用快照方案问题之Hystrix进行指标监控如何解决
通用快照方案问题之Hystrix进行指标监控如何解决
45 0
|
4月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
71 0
|
4月前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
50 0
|
6月前
|
缓存 NoSQL 中间件
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?epoll、poll和select + Reactor模式
【5月更文挑战第19天】`epoll`、`poll`和`select`是Linux下多路复用IO的三种方式。`select`需要主动调用检查文件描述符,而`epoll`能实现回调,即使不调用`epoll_wait`也能处理就绪事件。`poll`与`select`类似,但支持更多文件描述符。面试时,重点讲解`epoll`的高效性和`Reactor`模式,该模式包括一个分发器和多个处理器,用于处理连接和读写事件。Redis采用单线程模型结合`epoll`的Reactor模式,确保高性能。在Redis 6.0后引入多线程,但基本原理保持不变。
66 2
|
6月前
|
前端开发 网络协议 JavaScript
如何在前端实现WebSocket发送和接收TCP消息(多线程模式)
请确保在你的服务器端实现WebSocket的处理,以便它可以接受和响应前端发送的消息。同时,考虑处理错误情况和关闭连接的情况以提高可靠性。
529 0
|
缓存 编译器 调度
[笔记]Windows核心编程《七》用户模式下的线程同步
[笔记]Windows核心编程《七》用户模式下的线程同步

相关实验场景

更多
下一篇
无影云桌面