Java线程 interrupt 方法使用异常
背景
需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号。
在比较耗时的业务代码前增加判断 Thread.currentThread().isInterrupted() 抛出异常停止任务执行,并回退任务。
问题
中断信号发出后,任务线程一直未检测到中断信号状态。
以下为测试过程。
最终结论:线程 interrupt 方法不适用实际业务编码,应自定义线程中断状态。
第一次测试
无任何其他操作,只在各个阶段打印日志时间和线程中断状态。
观察信号中断时间和报表内日志的打印时间,判断任务中在哪个节点获取到的中断信号。
日志示例
中断信号发起时间
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
结论:未确定哪行代码将中断信号重置。
本文来自博客园,作者:好事的猫,转载请注明原文链接:https://www.cnblogs.com/BeiJiuGuRen/p/18619124
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇