Java线程 interrupt 方法使用异常

news/2024/12/20 13:54:54/文章来源:https://www.cnblogs.com/good--luck/p/18619124

背景

需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号。
在比较耗时的业务代码增加判断 Thread.currentThread().isInterrupted() 抛出异常停止任务执行,并回退任务。

问题

中断信号发出后,任务线程一直未检测到中断信号状态。
以下为测试结论。

第一次测试

无任何其他操作,只在各个阶段打印日志时间和线程中断状态。
观察信号中断时间和报表内日志的打印时间,判断报表程序中在哪个节点获取到的中断信号。

日志示例

中断信号发起时间

2024-12-20 09:52:23:011 erp-gl [XNIO-1 task-1] INFO c.u.c.c.c.ErpGlobalController[71] TxId=6664fc8e-0596-4012-8d23-ebd40de9977f SpanId= GLOBAL-终止线程=[ERP-REQ-10342620]

任务内各阶段中断信号校验时间

2024-12-20 09:52:17:253 erp-gl [ERP-REQ-10342620] INFO c.u.gl.program.GlReportTotalTypeAc[104] TxId= SpanId= 中断信号01 2024-12-20 09:52:17,false

2024-12-20 09:52:17:539 erp-gl [ERP-REQ-10342620] INFO c.u.gl.program.GlReportTotalTypeAc[138] TxId= SpanId= 中断信号02 2024-12-20 09:52:17,false

中断信号03 2024-12-20 09:52:41,false

中断信号04 2024-12-20 09:52:55,false

中断信号05 2024-12-20 09:53:12,false

中断信号06 2024-12-20 09:53:13,false

中断信号07 2024-12-20 09:53:14,false

结论:一直到程序执行完并未获取到中断信号,或者中断信号被某段代码重置。

第二次测试

在第一次测试的基础上,添加while代码
观察在未执行业务代码之前是否能获取到中断信号

中断信号发起时间

2024-12-20 10:08:34:978 erp-gl [XNIO-1 task-1] INFO c.u.c.c.c.ErpGlobalController[71] TxId=666a7b26-7f52-4ac4-b45a-c7c0e04ec75e SpanId= GLOBAL-终止线程=[ERP-REQ-10342620]

任务内各阶段中断信号校验时间

中断信号01 2024-12-20 10:08:31,false

2024-12-20 10:08:34:978 erp-gl [ERP-REQ-10342620] INFO c.u.gl.program.GlReportTotalTypeAc[163] TxId= SpanId= 捕获到中断信号时间: 2024-12-20 10:08:34

中断信号02 2024-12-20 10:08:34,true

中间有数据批量插入操作,中断信号被重置

中断信号03 2024-12-20 10:08:57,false

以下各阶段均为 false

结论:数据库插入操作将中断信号重置

第三次测试

调整while 位置,观察是否是因为数据库插入操作将中断信号重置

中断信号发起时间

2024-12-20 10:17:10:759 erp-gl [XNIO-1 task-1] INFO c.u.c.c.c.ErpGlobalController[71] TxId=66632106-d9f7-4210-afe3-95794f2ff6bc SpanId= GLOBAL-终止线程=[ERP-REQ-10342620]

任务内各阶段中断信号校验时间

中断信号01 2024-12-20 10:17:06,false

中断信号02 2024-12-20 10:17:06,false

while 循环操作,未获取到中断信号日志

中断信号03 2024-12-20 10:28:19,false

以下各阶段均为 false

结论:数据库插入操作导致中断信号被重置。

第四次测试

在第三次测试的基础上,注释 所有数据库插入操作,观察中断信号是否被重置

中断信号发起时间

2024-12-20 10:39:16:373 erp-gl [XNIO-1 task-1] INFO c.u.c.c.c.ErpGlobalController[71] TxId=6663bc98-bd9d-499e-aee4-28932e4c468f SpanId= GLOBAL-终止线程=[ERP-REQ-10342620]

任务内各阶段中断信号校验时间

中断信号01 2024-12-20 10:39:12,false

中断信号02 2024-12-20 10:39:12,false

捕获到中断信号时间: 2024-12-20 10:39:16

中断信号03 2024-12-20 10:39:16,true

中断信号04 2024-12-20 10:39:16,true

中间为双重for循环数据处理,没有任何数据插入操作,中断信号被重置

中断信号05 2024-12-20 10:39:32,false

结论:未确定哪行代码将中断信号重置。

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

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

相关文章

人员检测视频分析服务器安装网络监控系统时有哪些常见的技术挑战?

在构建一个高效、可靠的网络监控系统时,技术人员需要面对一系列技术挑战,这些挑战覆盖了从系统集成到信息安全的各个环节。随着技术的不断进步,尤其是在人工智能和物联网技术的推动下,安防监控系统变得更加复杂和强大。以下是在安装网络监控系统时可能遇到的一些常见技术挑…

六款电脑端简单好用的时间管理app对比推荐

今天分享六款压箱底的时间管理app,简单且好用,让你从此不再拖延!因为我平时工作用Windows电脑比较多,所以主要介绍可以在Win电脑端使用的,部分app还支持在手机端实时同步! 1、微软待办todo 微软生态系统集成,“我的一天” 可将今日任务展示于首页及 Widget 小组件。 “建…

jellyfine套件登录忘记密码

1.ssh登录群晖,管理员模式,进入蓝色路径 var--config---system.xml 2. 用vim命令修改文件内容将<IsStartupWizardCompleted>true</IsStartupWizardCompleted>改成<IsStartupWizardCompleted>false</IsStartupWizardCompleted>重启jellyfin ,重新初始…

排查Java进程占用CPU高的原因

背景 一般java程序占用cpu内存都不会太高,出现占用高的情况,第一反应就是,进程在某个地方死循环了。排查top -Hp 15057 查看下进程中的线程资源占用情况由上图可见,CPU时间片主要是被15393 这个线程给吃掉了, 所以目标锁定在 15393。 执行 printf "%x\n" 15393,…

Java 项目愚蠢的分层及解决方案

《整洁架构之道》的最后一章《细节决定成败》又在讨论 Javaer 永恒的问题:分层后 DAO Service Controller 应该按功能分包还是按层分包。 按功能分包的人认为这些文件在业务上是一起的,应该放在同一个包。按层分包的人认为每个层代表了不同的技术,应该按层分包。 可以想象,…

JS信息收集

引子:上一篇所介绍源码信息收集,主要针对目标站点不可见的后端源码进行收集,往往能收集到的概率小但危害较大。而本篇则介绍针对前后端分离&前端Web的JS的信息收集,由于源码本身可见,因此收集重点从源码转为源码中的敏感信息。免责声明:本文章仅用于交流学习,因文章…

vector容器/构造函数/赋值操作/容量和大小/插入和删除/数据存储/互换容器/预留空间

vector基本概念 功能: vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将元数据拷贝新空间,释放原空间vector容器的迭代器是支…

Win11系统如何更改为Win10右键菜单样?Win11系统更改为Win10右键菜单样式方法

Win11系统更改为Win10右键菜单样式方法: 1、按“Win+X”或者鼠标右键点击“开始”菜单,打开“终端管理员”。如下图:2、在命令输入下方命令: reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve3、按“Enter(…

manim边学边做--旋转

本篇介绍Manim中的两个旋转类的动画,名称差不多,分别是Rotate和Rotating。 Rotate类主要用于对图形对象进行指定角度、围绕特定点的精确旋转,适用于几何图形演示、物理模拟和机械运动展示等场景; Rotating类则侧重于创建让对象围绕指定轴或点持续旋转的动画,用于动态图标、…

【日记】什么叫做偷感十足哈哈哈哈哈哈哈哈哈(962 字)

正文今天只有一件比较有意思的事情。晚上应酬,提前庆祝冬至,吃的羊肉汤。我也不知道为什么自上了大学之后,去过的每一个地方都很重视冬至。或许因为快过年了?行领导,市分行检查组,还有一个客户。分了两桌,底层员工一桌,领导和客户一桌。来了三个人来我们这打圈…… 酒过…

博弈论+ybt题解

NIM游戏及其证明 题目描述即为T1,不多赘述有向图游戏及SG函数而对于由\(n\)个有向图游戏组成的组合游戏,设它们的起点分别为\(S_1, S_2, \ldots, S_n\),则有定理: 当且仅当\(\text{SG}(s_1) \oplus \text{SG}(s_2) \oplus \ldots \oplus \text{SG}(s_n) \neq 0\)时,这个游…

MapperScannerConfigurer 配置出错造成没有读取 db.properties 文件中的数据库连接参数

MyBatis 和 Spring 集成中,MapperScannerConfigurer 配置出错造成没有读取 db.properties 文件中的数据库连接参数,进而加载不到正确的 JDBC 驱动,本文记录了问题表现和问题分析。MyBatis-Spring 实现 MyBatis 和 Spring 框架集成。 问题现象 在配置中碰到不能加载 MySQL JD…