线程之两阶段终止模式(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

目录
相关文章
|
2月前
|
缓存 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后引入多线程,但基本原理保持不变。
43 2
|
2月前
|
前端开发 网络协议 JavaScript
如何在前端实现WebSocket发送和接收TCP消息(多线程模式)
请确保在你的服务器端实现WebSocket的处理,以便它可以接受和响应前端发送的消息。同时,考虑处理错误情况和关闭连接的情况以提高可靠性。
89 0
|
2月前
|
存储 缓存 Java
9.队列:生产消费模式及线程池的运用
9.队列:生产消费模式及线程池的运用
44 0
|
2月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
50 1
|
9月前
|
设计模式 存储 安全
面试易考:多线程模式下的单例模式两种具体实现(饿汉,懒汉),两个的线程安全性,阻塞队列,生产者消费者模型
面试易考:多线程模式下的单例模式两种具体实现(饿汉,懒汉),两个的线程安全性,阻塞队列,生产者消费者模型
|
9月前
|
缓存 编译器 调度
[笔记]Windows核心编程《七》用户模式下的线程同步
[笔记]Windows核心编程《七》用户模式下的线程同步
|
12月前
|
设计模式 Java 测试技术
异步模式之工作线程
异步模式之工作线程
|
12月前
|
设计模式 NoSQL Redis
Bio多线程消费者模式撑起Redis后台任务的半壁江上,这篇我干了,大家随意!
Bio多线程消费者模式撑起Redis后台任务的半壁江上,这篇我干了,大家随意!
|
12月前
|
负载均衡 NoSQL 安全
Redis:6.0多线程无锁(lock-free)设计和多线程Reactor模式助力Redis QPS更上一层楼
Redis:6.0多线程无锁(lock-free)设计和多线程Reactor模式助力Redis QPS更上一层楼
|
12月前
|
设计模式 安全 Java
Java中单例模式的线程安全性
Java中单例模式的线程安全性