每天学习一点点之从 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 sth
                Thread.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 enough
    LOGGER.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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据存储和内存对齐

校内课复习笔记 非数值数据表示 在计算机中&#xff0c;只有01序列&#xff0c;这串01序列是什么意思&#xff0c;由人为定义。 西文字符 在ASCII码中&#xff0c;通过一个65的偏移量&#xff0c;使得一部分无符号数指向A-Za-z。 在C语言中&#xff0c;通过char类型的转换规范…

Zookeeper Java SDK 开发入门

文章目录 一、概述二、导入依赖包三、与 Zookeeper 建立连接四、判断 ZooKeeper 节点是否存在四、创建 ZooKeeper 节点数据五、获取 ZooKeeper 节点数据六、修改 ZooKeeper 节点数据七、异步获取 ZooKeeper 节点数据八、完整示例 如果您还没有安装Zookeeper请看ZooKeeper 安装说…

问题 H: 棋盘游戏(二分图变式)

题意&#xff1a;要求找到 不放车就无法达到最大数的点 的个数 题解&#xff1a;1.以行列绘制二分图 2.先算出最大二分匹配数 3.依次遍历所有边 删除该边&#xff0c;并计算二分匹配最大值 &#xff08;若小于原最大值即为重要点&#xff09;&#xff0…

Vue3中使用provide和inject依赖注入完成父组件和孙子组件之间参数传递

Vue3中使用provide和inject依赖注入完成父组件和孙子组件之间参数传递 官网介绍 注意以下写法都是使用setup 代码结构 依赖注入-父组件 import { ref, provide } from "vue"const outDialogCardInfo ref() function updateOutDialogCardInfo(item) {console.log…

sCrypt Playground 发布

sCrypt Playground 发布了。 与桌面IDE 完全相同的功能&#xff0c;但是无需安装。体验地址: https://playground.scrypt.io。 请不要在 sCrypt Playground 上存储重要数据。我们会不定时清除用户保存在其上的数据。

韩国黄金代理商主动出击时机

受中东局势影响&#xff0c;十月底国际价格一度重新站上2000美元大关&#xff0c;韩国的黄格也随之出现上涨&#xff0c;当地投资者对黄金投资的热情再次升温。在韩国首尔市钟路附近的金店一条街&#xff0c;聚集了大大小小上百家金店&#xff0c;即使是在平日的中午&#xff0…

软件测试方案该怎么做?

做某项工作之前都需要有个计划或方案&#xff0c;软件测试亦如此。软件测试方案就是描述测试目的、范围、方法和软件测试的重点等文档。对于验证软件产品的可接受程度编写测试计划文档是一种有用的方式&#xff0c;可以使测试工作和整个开发工作融合起来&#xff0c;让资源和变…

OpenAI发布会震撼AI界,千字文全面解读

你的朋友圈是否被近日 OpenAI 的开发者大会刷屏了&#xff1f;这是预料之中的事。在近日&#xff0c;OpenAI 首度召开了旨在定义未来应用市场的开发者大会。 让我们迅速捕捉 OpenAI 最新的动态以及 ChatGPT 的更新亮点。 1、OpenAI 最新动态 今晨的盛会聚焦于以下要点&#xf…

docker安装SMQTT

docker安装SMQTT smqtt介绍 官方地址: https://www.smqtt.cc/ 官方文档地址: https://wiki.smqtt.cc/docs/smqtt/ 一款高性能&开源的MQTT服务器&#xff0c;支持单机、容器化、集群部署&#xff0c;支持多种协议&#xff0c;具备低延迟&#xff0c;高吞吐量&#xff0c;…

windows 电脑删除不了.TTF的文件

出现这个问题&#xff0c;首先检查&#xff0c;你的.ttf文件是不是在哪个软件中打开了。 如果是&#xff0c;先关掉&#xff0c;然后在删一遍试试。 如果这个还是不行试着打开控制面板>外观和个性化> 字体 > 字体设置>还原默认字体设置勾选&#xff0c;然后重启一下…

网络嵌入综述

图嵌入综述整理&#xff08;上&#xff09; 来源&#xff1a;图算法探索系列&#xff08;一&#xff09;&#xff1a;图嵌入模型的原理和应用篇【万字长文】 图9是DeepWalk模型在推荐场景下的应用。图9&#xff08;a&#xff09;显示的是不同用户在不同Session中的item点击序列…

使用MathType将文献中的数学公式进行转换

mathtype将文献中的数学公式进行转换 文章目录 mathtype将文献中的数学公式进行转换一、截图识别二、MathType下载与设置2.1、MathType介绍2.2、[下载位置](http://www.51xiazai.cn/soft/5975.htm)2.3、设置 三、使用MathType&#xff1a; 一、截图识别 这两个在线网站都可以将…

A股风格因子看板 (2023.11 第10期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第10期&#xff0c;指数组合数据截止日2023-10-31&#xff0c;要点如下 近1年A股风格因子收益…

谷歌提出AGI的6大原则,和5大能力等级

随着ChatGPT等大模型的出现,AGI概念正在从哲学层面快速转向实际应用落地&#xff0c;并且ChatGPT已经展示出了初级AGI的功能&#xff08;如AutoGPT&#xff09;,有不少专家认为&#xff0c;AGI时代可能在10年内到来。 因此&#xff0c;需要一个明确的技术框架来讨论和衡量不同…

【带头学C++】----- 六、结构体 ---- 6.7 结构体的对齐规则

6.7 结构体的对齐规则 6.7.1 知识点引入 6.7.2 结构体自动对齐规则 1、确定分配单位(一行分配多少字节) 结构体中最大的基本类型长度决定 2、确定成员的偏移量 成员偏移量成员自身类型的整数倍 需要根据你所在平台的位数&#xff0c;32位和64为类型大小不一样。cpu一次读取…

行情分析——加密货币市场大盘走势(11.15)

大饼按照预期等待下跌即可&#xff0c;现在已经下跌到35500&#xff0c;昨日晚上跌破了35000&#xff0c;现在放心大胆空。笔者现在都是空单在手。 空单策略&#xff1a;入场36000附近 止盈34000-32000 止损39000 以太昨日策略进场&#xff0c;已经止盈了&#xff0c;最低跌到…

11-Vue基础之组件通信(二)

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

git push 报错 The requested URL returned error: 500

今天gitpush时报错The requested URL returned error: 500 看报错应该是本地和gitlab服务器之间通信的问题&#xff0c;登录gitlab网站查看 登录时报错无法通过ldapadmin认证&#xff0c;ldap服务器连接失败。 首先&#xff0c;登录ldap服务器&#xff0c;查看是否是ldap服务…

浅聊汽车供应链数智化发展趋势

“2023中国汽车供应链大会暨第二届中国新能源智能网联汽车生态大会”在11月10日—12日&#xff0c;武汉经开区举办。围绕供应链安全与布局、新型汽车供应链打造、传统供应链升级、全球化发展等热点话题进行深入交流与探讨&#xff0c;寻找构建世界一流汽车供应链的对策、方法和…

macos死机后IDEA打不开,Cannot connect to already running IDE instance.

Cannot connect to already running IDE instance. Exception: Process 573 is still running 解决办法 进入&#xff1a;/Users/lzq/Library/Application Support/JetBrains 找到IDEA的目录删除隐藏文件夹 .lock rm -rf .lock