每天学习一点点之从 SonarQube Bug 看对线程中断异常的处理

最近在基于 SonarQube 对代码进行质量优化,说实话,之前觉得 SonarQube 这种很无聊,但最近静下心来看了一些扫描出来的问题后,发现这种工具作用还是挺大的,能够帮助我们找到代码中的隐藏缺陷,从而夯实基础。本文的议题就是基于 SonarQube Bug 探讨一下线程中断。

在 SonarQube 中的异常为“InterruptedException should not be ignored“:
在这里插入图片描述

即 SonarQube 认为 InterruptedException 异常不应该被忽视,即本文探讨的关键点就是 InterruptedException 异常该如何处理。

理解线程中断

线程中断我觉得有这么几个关键点:

  • 中断线程靠的是一个状态标识位
  • 标识位的状态传递涉及到线程间的通讯协作
  • Java 提供了原生 API 帮助我们传递、判断这个状态,一般也建议平时就使用这些 API 来操作线程中断

InterruptedException

关于 InterruptedException 我觉得有这么几个关键点:

  • 如果线程执行了如下几个底层方法,当线程被中断时,会抛出 InterruptedException

    java.lang.Object#wait()
    java.lang.Object#wait(long)
    java.lang.Object#wait(long, int)
    java.lang.Thread#sleep(long)
    
  • 抛出 InterruptedException 后会清除中断标识位

  • 属于 CheckedException,强制需要捕获处理

处理 InterruptedException

关于处理 InterruptedException,我觉得关键点在于开发者是否希望上层调用方感知当前线程的中断状态,因为(常规情况下)只有当前线程被中断了才会抛出这个异常,线程中断是一种状态,那么这种状态是否需要传递给上层调用方呢。

很明显 SonarQube 是不赞成忽视 InterruptedException 的。忽视 InterruptedException 会造成一个问题:线程中断的状态丢失,上层调用方将无法感知。

换句话来说,如果你觉得上层调用方没必要感知线程的中断状态,那么你可以忽视它(当然可能显得政治不正确);如果要感知中断状态,要么抛出 InterruptedException 交给上层处理或者 catch 后执行 java.lang.Thread#interrupt设置中断状态即可。

回到本次扫描的异常代码,其实就是想注册一个钩子做一些后续工作,不存在中断状态的感知问题,所以我个人认为其实不手动设置中断状态也 问题不大。

 Runnable shutdownHook = () -> {try {//do sthThread.sleep(dubboShutdownWait);//do sth} catch (InterruptedException e) {log.error(e);//Thread.currentThread().interrupt();}};Runtime.getRuntime().addShutdownHook(new Thread(shutdownHook));

而且还有个细节点,这里无非就是想让线程等会,干嘛非得用 java.lang.Thread#sleep(long) 方法呢,还得处理 InterruptedException,用 java.util.concurrent.locks.LockSupport#parkNanos(long) 不香嘛?

或者是不是也可以这样(就是玩):

    private static void workTime(long ms) {final long l = System.currentTimeMillis();while (System.currentTimeMillis() <= l + ms) {}}

附:完整 SonarQube 描述

为了便于后续查阅,这里完整贴出 SonarQube 的描述:

“InterruptedException” should not be ignored

InterruptedExceptions should never be ignored in the code, and simply logging the exception counts in this case as “ignoring”. The throwing of the InterruptedException clears the interrupted state of the Thread, so if the exception is not handled properly the fact that the thread was interrupted will be lost. Instead, InterruptedExceptions should either be rethrown - immediately or after cleaning up the method’s state - or the thread should be re-interrupted by calling Thread.interrupt() even if this is supposed to be a single-threaded application. Any other course of action risks delaying thread shutdown and loses the information that the thread was interrupted - probably without finishing its task.

Similarly, the ThreadDeath exception should also be propagated. According to its JavaDoc:

If ThreadDeath is caught by a method, it is important that it be rethrown so that the thread actually dies.

Noncompliant Code Example

public void run () {try {while (true) {// do stuff}}catch (InterruptedException e) { // Noncompliant; logging is not enoughLOGGER.log(Level.WARN, "Interrupted!", e);}
}

Compliant Solution

public void run () {try {while (true) {// do stuff}}catch (InterruptedException e) {LOGGER.log(Level.WARN, "Interrupted!", e);// Restore interrupted state...Thread.currentThread().interrupt();}
}

See

  • MITRE, CWE-391 - Unchecked Error Condition
  • Dealing with InterruptedException

References

  • https://blog.csdn.net/Dongguabai/article/details/110338023

欢迎关注公众号:
在这里插入图片描述

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

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

相关文章

三菱FX3U系列—小项目

目录 一、项目描述 二、IO口分配 三、运动功能图 四、项目程序 五、总结 一、项目描述 有些工作台&#xff0c;在工作台身上安装4个行程开关SQ1~SQ4&#xff0c;其中&#xff0c;SQ1、SQ2用来自动换向&#xff0c;当工作台运动到换向位置时&#xff0c;挡铁撞击行程开关&a…

网络超时检测-11.9

应用场景 在网络通信中&#xff0c;很多操作会使得进程阻塞&#xff1a; TCP套接字中的recv/acceptUDP套接字中的recvfrom超时检测的必要性 避免进程在没有数据时无限制地阻塞实现某些特定协议要求&#xff0c;比如某些设备规定&#xff0c;发送请求数据后&#xff0c;如果多长…

阿里云99元VS腾讯云88元,双11云服务器价格战,谁胜谁负?

在2023年的双十一优惠活动中&#xff0c;阿里云推出了一系列令人惊喜的优惠活动&#xff0c;其中包括99元一年的超值云服务器。本文将带您了解这些优惠活动的具体内容&#xff0c;以及与竞争对手腾讯云的价格对比&#xff0c;助您轻松选择最适合的云服务器。 99元一年服务器优…

23000 个恶意流量代理的 IPStorm 僵尸网络被拆除

美国司法部今天宣布&#xff0c;联邦调查局取缔了名为 IPStorm 的僵尸网络代理服务的网络和基础设施。 IPStorm 使网络犯罪分子能够通过世界各地的 Windows、Linux、Mac 和 Android 设备匿名运行恶意流量。 与此案相关的俄罗斯裔摩尔多瓦籍公民谢尔盖马基宁 (Sergei Makinin)…

儿童水杯上架亚马逊美国站CPC认证办理 ,常见儿童产品CPC认证测试要求

美国CPSC从2021/03/22开始改革&#xff0c;凡是他们管辖范围内的产品&#xff0c;都会被标记审查&#xff0c;如有相关产品请提前准备好相关文件比如CPC检测报告、认证等等&#xff0c;以备目的港海关审查。 CPC认证介绍 CPC证书即儿童产品证书&#xff0c;适用于12岁以下的儿…

【ArcGIS Pro二次开发】(76):面积平差工具

之前做过一个【三调土地利用现状分类面积汇总】的工具&#xff0c;在流程中使用了面积平差的方法。 考虑了在其它场合可能也需要进行面积平差&#xff0c;因此单独提取出来作为一个工具。 平差实现的方法如下图&#xff1a; 主要的计算过程如上图所示&#xff0c;算出总面积差…

DM8数据守护集群安装部署_手动切换

一.安装前准备 1.1 硬件环境建议 数据守护集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况&#xff0c;其他环境配置项建议请参考安装前准备工作。 1.1.1 网络环境 心跳网络对 mal 通讯系统的影响非常大&#xff0c;如果网络丢包或者延迟较大&#xff0c;则会严重影…

前后端分离项目为什么很火?有什么优势?

目录 一、什么是前后端分离 二、前后端分离项目的技术栈 三、前后端分离项目有什么优势 一、什么是前后端分离 前后端分离是一种软件架构的设计模式,它将应用程序的前端&#xff08;即用户界面&#xff09;和后端&#xff08;即服务器端&#xff09;进行解耦,使得它们可以独…

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

Django(六、模板层)

文章目录 模板传值模板语法传值特性 模板语法之过滤器常用的过滤器模板层之标签模板中的标签的格式为标签之if判断 标签之for循环模板的继承与导入模板导入导入格式 模板传值 """ 模板层三种语法 {{}}:主要与数据值相关 {%%}:主要与逻辑相关 {##}&#xff1a;模…

Java-绘图

文章目录 Java绘图Java绘图类绘图颜色与画笔属性设置颜色设置画笔 绘制文本显示图片图像处理1、放大与缩小2、图像翻转3、图像旋转4、图像倾斜 End Java绘图 Java绘图是指在Java程序中创建和显示图形的过程。Java提供了许多类和方法来支持绘图。 Java绘图类 Java中主要的绘图类…

2023年05月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有列表L=[‘UK’,‘china’,‘lili’,“张三”],print(L[-2])的结果是?( ) A: UK B: ‘lili’,‘张三’ C: lili D: ‘UK’,‘china’,‘lili’ 答案:C 列表元素定位 第2题 …