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

news2024/11/26 20:39:23

最近在基于 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遍历一个对象,并得出所对应的值

var dates {//定义的对象year:now.getFullYear(),month:now.getMonth()1,date:now.getDate(),hour:now.getHours(),minute:now.getMinutes(),second:now.getSeconds() }//开始遍历循环 var val; for (val in dates){console.log(对象名称&#xff1a;val-对象的值&#xff1a;…

【性能】如何计算 Web 页面的 FP 指标

什么是 FP 指标 FP (First Paint) 为首次渲染的时间点&#xff0c;在性能统计指标中&#xff0c;从用户开始访问 Web 页面的时间点到 FP 的时间点这段时间可以被视为 白屏时间&#xff0c;也就是说在用户访问 Web 网页的过程中&#xff0c;FP 时间点之前&#xff0c;用户看到的…

网络嵌入综述

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

8年经验的软件工程师建议

我希望在职业生涯早期就开始做的事情和我希望以不同的方式做的事情。 大家好&#xff0c;我已经做了八年半的软件工程师。这篇文章来源于我最近对自己在职业生涯中希望早点开始做的事情以及希望以不同方式做的事情的自我反思。 我在这里分享的对任何希望提高和进步到高级甚至…

【PyQt小知识 - 2】:QTextEdit内容的更新和获取、隐藏或显示滚动条、光标插入文本、文本自适应移动

文章目录 QTextEdit更新和获取内容隐藏或显示滚动条光标插入文本文本自适应移动 QTextEdit 更新和获取内容 更新&#xff1a;QTextEdit().setText(text) 或 QTextEdit().setPlainText(text) 获取&#xff1a;QTextEdit().toPlainText() setText()和setPlainText()的区别&…

自动化测试Mock神器:轻松模拟HTTP请求..

一、背景 在日常测试过程中或者研发开发过程中&#xff0c;目前接口暂时没有开发完成&#xff0c;测试人员又要提前介入接口测试中&#xff0c;测试人员不仅仅只是简单的编写测试用例&#xff0c;也可以通过一些mock的方法进行来提前根据接口测试的情况进行模拟返回接口的信息…

怎么选好用的电脑监控软件

在选择好用的电脑监控软件时&#xff0c;需要考虑多个因素&#xff0c;包括功能和特性、安全性和隐私保护、用户界面、实时监控和报警功能、日志记录和报告功能、兼容性以及用户评价和口碑等。 首先&#xff0c;需要明确你需要监控的内容&#xff0c;例如屏幕活动、应用程序使用…

U盘变成了.lnk,怎么处理

没曾想客户电脑是是不是有个病毒啥的&#xff0c;把我的U盘直接干成了只有一个.lnk的一个快捷方式&#xff0c;后面百度找了很多方法&#xff0c;最后找到了一个非常实用的方法&#xff0c;后整理了一下交给大家 方法如下&#xff1a; 1.找到电脑U盘文件 2.搜索框中输入你之…

正则提取记录

使用正则 https?:\/\/([^\/\s])/

TikTok女性创作者:媒体世界的新领袖

在数字时代&#xff0c;社交媒体已成为媒体和娱乐产业的关键组成部分&#xff0c;而TikTok作为最受欢迎的短视频分享平台之一&#xff0c;为女性创作者提供了一个独特的机会来在媒体世界中崭露头角。 这个平台不仅为女性创作者提供了一个创作和分享自己的声音、观点和创意的空…

Arthas搭建与使用

背景 在平时开发过程中经常会遇到日志打印有问题、代码不知道是否执行、定位运行缓慢的代码段等需求&#xff0c;这时往往需要排查很久&#xff0c;并且由于我们基于docker进行部署&#xff0c;一旦有问题要发包调试的话构建过程还是比较复杂耗时的&#xff0c;有时候打包只是…

为什么说MES管理系统是车间层与管理层的桥梁

随着制造业的快速发展&#xff0c;企业对于生产过程中的管理要求越来越高。为了满足这一需求&#xff0c;MES生产管理系统应运而生。MES管理系统作为车间层与管理层之间的桥梁&#xff0c;扮演着至关重要的角色。本文将探讨为什么说MES管理系统是车间层与管理层之间的桥梁。 一…

动画短片怎么制作gif?一个方法简单又好用

网络上常常能看到动画短片&#xff0c;虽然时长短但是内容很丰富。当我们想要将这种动画短片做成gif格式图片的时候&#xff0c;应该怎么办呢&#xff1f;很简单&#xff0c;通过使用在线制作动画&#xff08;https://www.gif.cn/&#xff09;网站&#xff0c;无需下载软件上传…

uniapp生成自定义(分享)图片并保存到相册

需求描述 在一个页面中底部有个保存图片的功能&#xff0c;点击能够保存一张生成的自定义表格图片。 第一眼见到这个需求 自己会出现了两个问题 如何去处理图片中的自定义内容以及样式如何将自定义内容转化成图片 至于保存图片&#xff0c;uniapp有对应的api去实现uni.saveIma…

顶象获“直通乌镇”全球互联网大赛二等奖

11月10日&#xff0c;2023“直通乌镇”全球互联网大赛在浙江乌镇圆满落幕。本次大赛由世界互联网大会、浙江省人民政府主办&#xff0c;旨在探索互联网发展的新技术、新模式、新业态&#xff0c;推动全球互联网合作创新&#xff0c;激发互联网创业活力。 在当天的颁奖典礼上&a…

栈:括号匹配问题!

目录 题目&#xff1a; 思路分析&#xff1a; 解题思路&#xff1a; 一、配对&#xff1a; 二、数量问题&#xff1a; 三、细节问题&#xff1a; 完整代码&#xff1a; 手撕栈&#xff1a; 题目&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&…

微签:电子签章实力派,这19年从幕后走向台前

微签是什么&#xff1f;尽管在电子签章领域已深耕19年 &#xff0c;是国内电子签名市场的拓荒者之一&#xff0c;但因为其低调的风格&#xff0c;一直不为众人所知。不过&#xff0c;如果现在你想对目前市面上的电子签名厂商做一个专业客观的盘点的话&#xff0c;不管从哪个角度…

【论文精读2】R-MVSNet

R-MVSNet【递归多视图立体网络】&#xff0c;论文全名&#xff1a;“Recurrent MVSNet for High-resolution Multi-view Stereo Depth Inference”&#xff0c;CVPR 2019(CCF A) 在MVSNet的基础上做了一些改进&#xff0c;主要解决的问题是代价体正则化&#xff08;Cost Volume…

大语言模型概述|亚马逊这些互联网公司为什么花巨资训练自己的模型?

2023年可谓是大语言模型元年&#xff0c;OpenAI、亚马逊、谷歌等互联网公司争先恐后推出了自己的大语言模型&#xff1a;GPT-4、Titan、PaLM 2&#xff0c;还有亚马逊即将推出的第二个大语言模型Olympus等等。这一革命性技术如今已经在全球范围内引发了广泛的讨论和关注&#x…

用于部署汽车AI项目的全面自动化数据流程

如何创建、优化和扩展汽车 AI 的数据流程 想到汽车行业的人工智能 (AI) 时&#xff0c;脑海中可能会立即浮现未来的道路上遍布自动驾驶汽车的情景。虽然这一切尚未实现&#xff0c;但汽车行业已在 AI 方面取得诸多进步&#xff0c;不仅安全性提高&#xff0c;车内体验也得到改…