Java线程 interrupt 方法使用异常
背景
需要在异步任务中中断任务的执行,故选择通过调用 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
结论:未确定哪行代码将中断信号重置。
Java线程 interrupt 方法使用异常的更多相关文章
- “全栈2019”Java多线程第六章:中断线程interrupt()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java 学习笔记之 线程interrupt方法
线程interrupt方法: interrupt方法是用来停止线程的,但是他的使用效果并不像for+break那样,马上就停止循环. 调用interrupt()其实仅仅是在当前线程中打了一个停止标记, ...
- Java线程通讯方法之wait()、nofity() 详解
Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...
- Java 多线程 interrupt方法
interrupt 下面是interrupt方法的文档的一部分: * <p> If this thread is blocked in an invocation of the {@lin ...
- java线程基础方法详解
一.线程状态转换 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行 ...
- JAVA thread0.interrupt()方法
interrupt()只是改变中断状态而已,interrupt()不会中断一个正在运行的线程.这一方法实际上完成的是,给受阻塞的线程抛出一个中断信号,这样受阻线程就得以退出阻塞的状态. 更确切的说,如 ...
- Java线程--interrupt join yield setDaemon常用方法的使用
概念: 操作系统可以有多个进程,一个线程可以有一个或多个线程.进程与进程之间不共享内存,都在各自的空间中运行.而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈. 线程又称轻量级进程.J ...
- java线程interrupt、interrupted 、isInterrupted区别
前言 在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关. interrupt() 方法 作用于要中断的那个线程. interrupt( ...
- java线程异常处理方法
工作中常发现有些程序发生异常但却没有错误日志,原因就是一些开发线程异常处理错误,导致程序报错但异常信息打印到堆栈上,不好在生产环境中定位问题. 在java多线程程序中,所有线程都不允许抛出未捕获的ch ...
- Java线程阻塞方法sleep()和wait()精炼详解
版权声明:因为个人水平有限,文章中可能会出现错误,如果你觉得有描述不当.代码错误等内容或者有更好的实现方式,欢迎在评论区告诉我,即刻回复!最后,欢迎关注博主!谢谢 https://blog.csdn. ...
随机推荐
- PHP运算符优先级(摘自在线工具)
PHP运算符优先级 结合方向 运算符 附加信息 非结合 clone new clone 和 new 左 [ array() 非结合 ++ -- 递增/递减运算符 非结合 ~ - (int) (floa ...
- Android MTP流程
概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介 对Mtp协议进行简单的介绍.第2部分 MTP框架 介绍Android系统下MTP的框架.第3部分 ...
- 1. react项目【前端】+C#【后端】从0到1
1.创建前端基础框架 1.1 前端创建 软件: 1.1.1 npx create-react-app pc ps:pc 是文件名 : 1.1.2 npm start 启动项目 2.创建后端基础框架 软 ...
- 虚拟dom的优缺点
虚拟dom 是js模拟的一颗dom树,也是 js 对象 : 虚拟dom 时相对于 真实dom而言的,操作真实 dom 开销太大,降低了性能,所以使用 虚拟 dom 替代真实 dom 完成操作和计算功能 ...
- SQL注入利用及绕过总结
SQL注入及绕过姿势总结 概述 SQL注入指用户输入的参数可控且没有被过滤,攻击者输入的恶意代码被传到后端与SQL语句一起构造并在数据库中执行 不同数据库的语法可能存在差异,以MySQL为例,其他差异 ...
- DOS特殊字符的转义方法
- 实现.NET 4.0下的Task类相似功能组件
实现 .NET 4.0 下的 Task 类相似功能:TaskExCum 组件详解 引言 随着 .NET 技术的发展,异步编程模型逐渐成为现代应用程序开发中的标准实践之一..NET 4.5 引入了 Ta ...
- 初识GO语言--基本数据类型
- games101_Homework7
实现完整的 Path Tracing 算法 需要修改这一个函数: • castRay(const Ray ray, int depth)in Scene.cpp: 在其中实现 Path Tracing ...
- 大便系统无法使用source的原因及解决方法
debian中shell脚本无法使用source的原因及解决方法 现象: shell脚本中source aaa.sh时提示 source: not found 原因: ls -l `which sh` ...