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

news/2025/1/11 14:25:59/

目录

        • 一、两阶段终止模式说明
        • 二、错误思路
        • 三、实现思路图
        • 四、实现思路
        • 五、方法说明
        • 六、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();// 重新设置打断标记 为truethread.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.ppmy.cn/news/83670.html

相关文章

MyBatis源码学习三之查询主逻辑

MyBatis源码学习三之查询主逻辑 继续上一章节。 MyBatis的一个主要流程图。从图中可以看出,核心的东西主要集中在3个Handler中。分别是入参处理,执行sql语句处理,以及返回结果处理。 一 实例 Test public static void main(String[] args…

想变身“科技型”企业?掌汇云数字化服务平台为工业升级加分

40万亿元!占GDP比重达到33.2%,这就是国新办公布的2022年数据,中国工业可以说是当之无愧的支柱产业。 中国工业规模大、覆盖面广,企业员工众多,项目遍及海内外。但由于科技欠发达、信息不流通等因素,近些年…

【加解密】bcryptjs | CryptoJS | JSEncrypt | node-rsa 加密| 解密 | RSA | ASE | MD5

加解密 1、 bcryptjs 解密 - 只可加密,比对密码,不可解密 下载 npm i bcryptjs 作用:字符串加密,已加密的字符串不可破解,只可比对。优点:加密的字符不可解密缺点:已加密的字符不可解密&#…

WebSocket全双工通信SpringBoot实现

【IT老齐238】十分钟上手WebSocket全双工通信协议_哔哩哔哩_bilibili【IT老齐238】十分钟上手WebSocket全双工通信协议, 视频播放量 8348、弹幕量 23、点赞数 318、投硬币枚数 157、收藏人数 257、转发人数 30, 视频作者 IT老齐, 作者简介 老齐的个人V: itlaoqi001 ~~欢迎前来交…

鳌图 AutoCapital:进化中的新型机构长什么样?

鳌图 AutoCapital 提供了一条新的产业投资思路。 数科星球原创 作者丨苑晶 编辑丨大兔 时代塑造个人,时代也会迭代出现新的投资机构。第一代投资人和投资机构,或是学成于美国或就职于投行;目前人民币基金越来越多出现了产业和投资双背景的…

详细介绍一下Go1.17 特性,优缺点以及需要改进的地方

Go1.17 是 Go 语言的一个重要版本,于2021年8月16日发布。这个版本包含了一些新的特性、改进和 bug 修复,下面对其进行详细介绍。 Go 编译器和工具链的速度得到了大幅度提升。在新版本中,新增的 SSA 后端可以使 Go 编译器的编译速度提升 20% 至 30%。并且在 Go 1.17 版本中,…

Android 12.0屏蔽掉SystemUI的某些通知提示音

1.概述 在12.0的系统开发中,在系统SystemUI中会发一些通知的声音,但是同时也会在开机的时候,会有一些通知的声音,特别是不想要的一些通知的声音, 这些对于产品还是有一些影响的,所以为了产品体验,就需要屏蔽掉一些开机的通知的声音 2.屏蔽某些通知的提示音的核心代码 …

uniapp沉浸式渐变状态栏

插件地址&#xff1a;沉浸式渐变状态栏 - DCloud 插件市场 标准用法 <v-headerview actionBarColor"#fac90f" titleColor"#ffffff" pageTitle这是标题 ><template v-slot:title><!--如需自定义标题&#xff0c;用这个slot自定义内容。否则…