设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式

思考一下

  1. 在线程1中如何终止线程2?
  2. stop()?还是System.exit()?还是其他方式

方式解答

1.使用stop()不可取
线程对象的stop()方法会直接杀死线程,假设此时使用了线程锁,当此时使用了stop()命令会导致线程锁无法释放,以至于程序出现严重的问题,其中最常见的是死锁。还可能导致资源泄露,因为其他线程无法获取到被持有的资源。这可能会导致内存泄露或者其他资源的持续占用,最终导致系统资源耗尽。

什么是死锁?

死锁是指两个或多个线程相互持有对方所需的资源,导致它们都在等待对方释放资源,从而永远无法继续执行下去。当发生死锁时,程序可能会完全停止响应,或者表现出非常低的性能。在生产环境中,死锁可能导致程序崩溃或系统不稳定。

2.System.exit(int)不可取
System.exit(int)此方法是停止所有线程,此做法会使程序整个终止掉。

详细解释

  • 当调用System.exit(int) 时,JVM 将立即终止当前程序的执行,并返回一个整数状态码。通常情况下,返回值 0表示程序正常结束,非零值表示程序出现了某种异常或错误。这意味着可以根据System.exit(int) 返回值来判断程序的结束状态,并在必要时采取相应的措施。
  • 需要注意的是,调用System.exit(int)将立即终止程序的执行,因此任何在该方法调用之后的代码都将不会被执行。因此,需要小心使用该方法,避免在不必要的情况下过早地终止程序的执行。
  • 通常情况下,不建议在常规的程序流程中经常使用System.exit(int),除非在特定情况下需要强制结束程序的执行。更好的做法是通过返回值或异常来控制程序的执行流程。

正确停止: Two-phase Termination(两阶段终止)模式

  • 将终止过程分成两个阶段,其中第一个阶段主要是线程 T1 向线程 T2发送终止指令,而第 二阶段则是线程 T2响应终止指令。
  • Java 线程进入终止状态的前提是线程进入 RUNNABLE 状态,而利用java线程中断机制的interrupt()方法,可以让线程从休眠状态转换到RUNNABLE 状态。RUNNABLE 状态转换到终止状态,让 Java 线程自己执行完 run()方法,所以一般我们采用的方法是设置一个标志位,然后线程会在这个标志位检查,如果发现符合终止条件,则自动退出run() 方法。

两阶段终止模式是一种应用很广泛的并发设计模式,在 Java 语言中使用两阶段终止模式来终止线程,需要注意两个关键点:

  1. 仅检查终止标志位是不够的,因为线程的状态可能处于休眠态;
  2. 仅检查线程的中断状态也是不够的,因为我们依赖的第三方类库很可能没有正确处理中断异常.
    例如:
    Google Guava库中的com.google.common.io.Files类中的copy方法。在早期的版本中,这个方法可能没有正确处理中断异常。当在文件拷贝过程中线程被中断时,该方法可能会忽略中断并继续执行文件拷贝操作,而不会抛出InterruptedException。开发人员可能需要手动捕获中断异常并进行适当的处理。

使用场景

  1. 安全地终止线程,比如释放该释放的资源;
  2. 要确保终止处理逻辑在线程结束之前一定会执行时,可使用该方法;

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

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

相关文章

当浏览器输入url的时候会发生什么?

说在前面 当我们在浏览器中输入URL并按下回车时,背后发生了一系列神秘的操作。本文将带您深入了解,从URL解析到页面渲染,揭秘浏览器输入URL的完整流程。 具体步骤 当浏览器输入URL时,一般经过以下细节步骤: 1、引言 …

利用Qt输出XML文件

使用Qt输出xml文件 void PixelConversionLibrary::generateXML() {QFile file("D:/TEST.xml");//创建xml文件if (!file.open(QIODevice::WriteOnly | QIODevice::Text))//以只写方式&#xff0c;文本模式打开文件{qDebug() << "generateXML:Failed to op…

语义分割miou指标计算详解

文章目录 1. 语义分割的评价指标2. 混淆矩阵计算2.1 np.bincount的使用2.2 混淆矩阵计算 3. 语义分割指标计算3.1 IOU计算方式1(推荐)方式2 3.2 Precision 计算3.3 总体的Accuracy计算3.4 Recall 计算3.5 MIOU计算 参考 MIoU全称为Mean Intersection over Union&#xff0c;平均…

Docker五部曲之三:镜像构建

文章目录 前言Docker构建架构构建指令构建上下文本地目录Git存储库压缩文件纯文本文件.dockerignore文件 Dockerfile解析器指令环境变量命令执行格式exec格式shell格式 FROMRUNCMDLABELEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRARGONBUILDSHELL 多级构建 前言 本文均翻译自…

java-ArrayBlockingQueue详解

在Java并发编程中&#xff0c;ArrayBlockingQueue是一个非常常用的工具类。它是一个由数组支持的有界阻塞队列&#xff0c;提供了线程安全的队列操作。 1.ArrayBlockingQueue概述 ArrayBlockingQueue是一个基于数组实现的阻塞队列&#xff0c;它继承自AbstractQueue并实现了B…

一周速递|全球车联网产业动态(2024年1月14日)

政策法规 1、1月9日&#xff0c;国家发展改革委、商务部、市场监管总局发布《关于支持广州南沙放宽市场准入与加强监管体制改革的意见》&#xff0c;提出加快智能&#xff08;网联&#xff09;汽车多场景试点应用及商业化运营&#xff0c;推动电动垂直起降飞行器&#xff08;e…

对快速排序思想的进一步理解,分而治之,欧几里得算法(常用求最大公约数的方法)

自己找到的最优的快排的代码 快速排序 思想 分而治之使用欧几里得算法&#xff08;辗转相除法&#xff09;来求解一个应用题 假设有一块地&#xff0c;现在用这个同样大小的正方形来铺满&#xff0c;求所可用的最大的正方形地砖的面积 这两个方法放在一起是因为这个欧几里得要…

Linux环境之Ubuntu安装Docker流程

今天分享Linux环境之Ubuntu安装docker流程&#xff0c;Docker 是目前非常流行的容器&#xff0c;对其基本掌握很有必要。下面我们通过阿里云镜像的方式安装&#xff1a; 本来今天准备用清华大学镜像安装呢&#xff0c;好像有点问题&#xff0c;于是改成阿里云安装了。清华安装…

抓交通肇事犯(python)

问题描述&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有三人目击该事件&#xff0c;但都没有记住车号&#xff0c;只记下了车号的一些特征。甲说&#xff1a;牌照的前两位数字是相同的&#xff1b;乙说&#xff1a;牌照的后两位数字是相同的&#xff0c;但…

GVM垃圾收集器

Serial收集器&#xff08;新生代&#xff09; Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾收集器&#xff0c;采用“标记-复制”算法负责新生代的垃圾收集。它是Hotspot虚拟机运行在客户端模式下的默认新生代收集器。 它是一个单线程收集器。它会使用…

软件测试学到这个程度,面试轻松拿下20K

很多人认为&#xff0c;软件测试是一个简单的职位&#xff0c;职业生涯走向也不会太好&#xff0c;但是随着时间的推移&#xff0c;软件测试行业的变化&#xff0c;人们开始对软件测试行业的认知有了新的高度&#xff0c;越来越多的人开始关注这个行业&#xff0c;开始重视这个…

v-if控制div内容显示,克隆这个div但是v-if没有效果

问题描述&#xff1a; 我的子页面打印的时候通过isPdf来隐藏“选择参加人员”按钮。 我子页面有个el-dialog&#xff0c;el-dialog里面有个大的div它的id为app-pre-meet-add&#xff0c;在子页面我通过isPdf来显示我想要的内容。现在我在父页面先通过this.$refs.child.control…

常用电容功能以及型号

电容在电子电路中具有多种重要作用&#xff0c;以下是其主要功能&#xff1a; 1. **隔直流、通交流**&#xff1a;电容器对直流电压有阻断作用&#xff08;理想情况下完全阻止直流通过&#xff09;&#xff0c;而对于交流信号则可以允许通过。这是因为电容器可以通过充放电过程…

分布式缓存

分布式缓存 缓存雪崩 缓存雪崩我们可以简单的理解为&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库 CPU 和内存造成巨大压力&#xff0c;严重的会造成数据库宕机。从而形成一系列连锁反应&#xf…

225.【2023年华为OD机试真题(C卷)】游戏分组(DFS深度优先搜索-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-游戏分组二.解题思路三.题解代码Python题解代码…

C++与Typescript的区别

目录 一、C类模板和函数模板 1.类模板 2.函数模板 二&#xff0c;Typescript 的泛型声明 1.泛型函数 2.泛型类 为什么C和Typescript语言中主张模板和泛型 一、C类模板和函数模板 在C中&#xff0c;类模板和函数模板允许你为多种数据类型编写通用的代码。这就像每个人都有…

uniapp如何封装接口

在uniapp中封装接口可以使用uni.request方法&#xff0c;示例代码如下&#xff1a; // 封装接口 export function getGoodsList(params) {return new Promise((resolve, reject) > {uni.request({url: http://api.example.com/goods,method: GET,data: params,success: res…

山西电力市场日前价格预测【2024-01-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-14&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为851.84元/MWh&#xff0c;预计出现在18:15。最低日前电价为198.87元/MWh&#xff0c;预计…

使用 C++/WinRT 创作 API

如果 API 位于 Windows 命名空间中 这是你使用 Windows 运行时 API 最常见的情况。 对于元数据中定义的 Windows 命名空间中的每个类型&#xff0c;C/WinRT 都定义了 C 友好等效项&#xff08;称为投影类型 &#xff09;。 投影类型具有与 Windows 类型相同的完全限定名称&…

【LabVIEW FPGA入门】使用CompactRIO进行SPI和I2C通信

NI提供了 SPI and I2C Driver API&#xff1a;下载SPI and I2C Driver API - NI 该API使用FPGA数字I / O线与SPI或I2C设备进行通信。 选择数字硬件时&#xff0c;要考虑三个选项&#xff1a; NI Single-Board RIO硬件可同时使用SPI和I2C驱动程序。NI 9401 C系列模块与SPI驱动程…