【多线程】两阶段终止模式

news2024/12/24 8:32:05

目录

        • 一、两阶段终止模式说明
        • 二、错误思路
        • 三、实现思路图
        • 四、实现思路
        • 五、方法说明
        • 六、interrupt实现
          • 6.1 代码示例
          • 6.2 示例截图
        • 七、volatile实现
          • 7.1 代码示例
          • 7.2 示例截图

一、两阶段终止模式说明

  • 1.在一个线程t1中优雅地终止另一个线程t2,指终止t2线程前,让t2线程有一个料理后事的机会

二、错误思路

  • 1.使用线程对象的stop方法停止线程
  • 2.stop方法会真正杀死线程,如果线程锁住了共享资源,杀死该线程后再也没有机会释放锁,其它线程将永远无法获取锁
  • 3.使用System.exit(int)方法停止线程
  • 4.如果只想停止某个线程,System.exit方法会让整个程序都停止

三、实现思路图

在这里插入图片描述

四、实现思路

  • 1.while(true)死循环
  • 2.判断有没有被打断,如果被打断,料理后事,结束循环
  • 3.如果没有被打断,睡眠2秒,睡眠期间没有异常,执行操作,继续循环
  • 4.睡眠期间有异常,设置打断标记,抓住异常,并重置打断标记,继续循环,判断被打断了,料理后事,结束循环

五、方法说明

  • 1.isInterrupted() 判断是否被打断,不会清除打断标记
  • 2.interrupt() 打断线程,如果被打断的线程正在sleep、wait、join会导致被打断的线程抛出InterruptedException异常,并清除打断标记;如果被打断正在运行的线程,则会设置打断标记;park的线程被打断也会设置打断标记
  • 3.interrupted() 判断当前线程是否被打断,会清除打断标记

六、interrupt实现

6.1 代码示例
package com.learning.interrupt;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description 两阶段终止模式
 */
@Slf4j
public class TwoPhaseTermination {
    // 监控线程
    private Thread monitorThread;

    // 启动监控线程
    public void start(){
        monitorThread = new Thread(()->{
            while(true){
                Thread thread = Thread.currentThread();
                if(thread.isInterrupted()){
                    log.info("料理后事");
                    break;
                }
                try {
                    // 睡眠期间被打断
                    Thread.sleep(1000);
                    // 执行监控操作被打断
                    log.info("执行监控操作");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 重新设置打断标记 为true
                    thread.interrupt();
                }
            }
        });
        monitorThread.start();
    }

    // 停止监控线程
    public void stop(){
        monitorThread.interrupt();
    }

    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
        twoPhaseTermination.start();

        Thread.sleep(3500);
        twoPhaseTermination.stop();
    }
}
6.2 示例截图

在这里插入图片描述

七、volatile实现

7.1 代码示例
package com.learning.interrupt;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author Jun.Wang
 * @Date 2023/5/25 14:32
 * @Description 两阶段终止模式 volatile
 */
@Slf4j
public class TwoPhaseTermination_Volatile {
    // 监控线程
    private Thread monitorThread;
    private volatile boolean stop;

    // 启动监控线程
    public void start(){
        monitorThread = new Thread(()->{
            while(true){
                if(this.stop){
                    log.info("料理后事");
                    break;
                }
                try {
                    // 睡眠期间被打断
                    Thread.sleep(1000);
                    // 执行监控操作被打断
                    log.info("执行监控操作");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        monitorThread.start();
    }

    // 停止监控线程
    public void stop(){
        this.stop = true;
        monitorThread.interrupt();
    }

    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination_Volatile twoPhaseTermination = new TwoPhaseTermination_Volatile();
        twoPhaseTermination.start();

        Thread.sleep(3500);
        twoPhaseTermination.stop();
    }
}

7.2 示例截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】位图/布隆过滤器+海量数据处理

✍作者:阿润菜菜 📖专栏:C 文章目录 前言一 位图1.位图法介绍2.位图实现的细节 二、布隆过滤器1.布隆过滤器概念2.布隆过滤器实现 三、海量数据处理1. 位图应用2. 哈希切割3. 布隆过滤器 前言 题目 给40亿个不重复的无符号整数,没…

Java

FileOutputStream写数据的3种方式 void write(int b) //一次写一个字节的数据 void write(byte[] b) //一次写一个字节数组数据 void write(byte[] b, int off,int len) //一次写一个字节数组的部分数据 参数一:数组;参数二:起始索引 0;参数三:个数换行: windows:“\r\n” lin…

springboot+java小区社区宽带安装管理系统

本次程序软件的开发的目的就是让使用者可以通过使用该软件提高信息数据的管理效率,同时该程序软件也需要针对不同的操作用户设置对应的功能,因此,此程序的操作流程应该尽量与用户日常操作软件的行为习惯相贴合,另外,程…

分享最强国内免费ChatGPT的镜像网站,记得收藏(2023年更新中)

众所周知的原因,要想在国内使用ChatGPT,肯定是要“折腾一番”的。但是对于绝大多数普通小白,有没有比较容易的方法就用上官方的ChatGPT呢?答案是肯定的,下面就给大家分享几个2023年我正在使用的ChatGPT镜像网址&#x…

Python入门学习

一、执行Python(Hello World)程序 对于大多数程序语言,第一个入门编程代码便是 “Hello World!”,以下代码为使用 Python 输出 “Hello World!” 1.1 创建hello.py文件 1.2 编写程序 #!/usr/bin/python…

听我一句劝,别去外包,干了五年,废了....

先说一下自己的情况,大专生,18年通过校招进入杭州某软件公司,干了接近5年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了5年的功能测试…

Gateway网关参数进行验签POST 包含requestbody 请求体封装

Gateway网关自定义拦截器的不可重复读取数据 特别注意一点, 因为在网关层 拿出 request 流之后,必须重写getbody()方法把所有的参数放进去,否则后面转发的请求无法接收到任何数据, 坑,巨坑,因为版本问题网上很多都不能兼容, 我的springboot环境 依赖包 <parent><gr…

Linux--ServerProgramming--TCP\IP协议族

1.TCP/IP 协议族 1.1 TCP/IP协议族及主要协议 TCP/IP 协议族是一个四层协议系统。自上而下为&#xff08;如下图所示&#xff09;&#xff1a;应用层传输层网络层数据链路层 应用层负责处理应用程序逻辑&#xff0c;在用户空间实现。&#xff08;少数服务器程序在内核中实现。…

如何下载外文期刊文献,怎么下载又快又省力!

文章开头我们先了解一下下面这些查找外文期刊文献的数据库: 1、Web of Science&#xff1a;是获取全球学术信息的重要数据库。它收录了全球13000多种权威的、高影响力的学术期刊&#xff0c;内容涵盖自然科学、工程技术、生物医学、社会科学、艺术与人文等领域。其中以SCIE、S…

OpenCV入门简单的人脸识别项目

在学会图像处理和打开摄像头获取视频流后&#xff0c;就可以开展简单的人脸识别项目。 文章目录 检测人脸区域并绘制矩形多个人脸进行识别绘制五官位置视频检测人脸人脸识别 人脸识别首先需要检测到人脸。 检测人脸区域并绘制矩形 # 加载图片img face_recognition.load_image…

接口全生命周期的生产利器 ApiKit

一、ApiKit 整体介绍&#xff1a; 1、接口管理的需求与现状&#xff1a; 在软件项目研发的过程中&#xff0c;必然存在以下几个需求&#xff1a; API 接口文档的管理&#xff0c;常用的解决方案有 Swagger API 接口的调试&#xff0c;常用的解决方案有 Postman API 接口的自…

Java——网络编程套接字

目录 一、网络编程基础 1.1 为什么需要网络编程&#xff1f;——丰富的网络资源 二、什么是网络编程? 三、网络编程中的基本概念 3.2 请求和响应 3.3 客户端和服务端 常见的客户端服务端模型 四、Socket套接字 五、通信模型 5.1 Java数据报套接字通信模型 5.2 Java流…

【大数据之Hive】二、Hive安装

Hive安装部署&#xff08;最小化部署&#xff09; 安装部署Hive&#xff08;最小化只用于本机测试环境中&#xff0c;不可用于生产环境&#xff09;&#xff0c;并运行。 步骤&#xff1a; &#xff08;1&#xff09;把apache-hive-3.1.3-bin.tar.gz解压到/opt/module/目录下&…

IIC总线学习

IIC总线 1.总线空闲状态。2.IIC总线的起始停止条件。3.IIC总线的数据传送4.IIC总线的应答5.IIC时序 1.总线空闲状态。 总线空闲时&#xff0c;SDA和SCL均为高电平。 2.IIC总线的起始停止条件。 起始条件&#xff1a;在SCL为高时&#xff0c;SDA总线被拉低&#xff0c;即出现…

json-server的基本使用

1、mock是什么&#xff1f; mockjs 作用&#xff1a;生成随机数据&#xff0c;拦截 Ajax 请求 目的&#xff1a;很多时候前端开发页面的过程中&#xff0c;后端的接口并没有写好&#xff0c;这个时候需要前端自己定义接口及接口的返回数据的结构体&#xff0c;这个时候就需要…

【活动】云计算的优势与发展趋势

写在前面 人生是一场消耗&#xff0c;要把美好的时光放在喜欢的人与事上。 一、前言 云计算作为一种新兴的信息技术应用解决方案&#xff0c;可以帮助企业解决IT资源利用率低、IT基础设施的建设和维护成本高、IT系统的安全和稳定性问题等痛点&#xff0c;提高企业的业务灵活性…

react表格行下载文件方法总结

一、前言 下载文件时&#xff0c;后台接口返回的响应体是文件流格式的&#xff0c;前端接收时如果不进行处理&#xff0c;就会无法正确下载文件&#xff08;有可能会直接打开文件等&#xff09;。 在此记录下react的表格行使用file-saver下载文件的方法。&#xff08;注意不同…

文件包含的本质、预处理符号、# vs ##

何为头文件&#xff1f; 在C语言中&#xff0c;文件包含是一种常见的编程技术&#xff0c;它允许程序员在一个源文件中使用另一个源文件中的函数或变量。 文件包含通常使用#include预处理指令来实现。#include指令告诉预处理器将文件的内容插入到当前文件的指定位置中。 例如&a…

今天面了个阿里拿 38K 出来的,让我见识到了测试界的天花板

一直觉得自己的技术已经很不错了&#xff0c;直到最近遇到了一个阿里来的大佬 5年测试&#xff0c;应该是能达到资深测试的水准&#xff0c;即不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;而且还应该能全面…

第04章 IDEA的安装与使用

【Why IDEA ?】 【注】JetBrains官方说明&#xff1a; 尽管我们采取了多种措施确保受访者的代表性&#xff0c;但结果可能会略微偏向 JetBrains 产品的用户&#xff0c;因为这些用户更有可能参加调查。 此外&#xff0c;2022年&#xff0c;某美国软件开发商在对近千名专业的J…