InterruptedException 时应该如何处理

最近项目中开起来sonar的规范扫描, 提示了InterruptedException处理有问题, 所以记录下
 

当前的做法: 

方式A: 什么都不做, 或者 打印异常的堆栈信息, 或者 记录log

==============================================

单线程场景下是不会 遇到该异常的

==============================================

假设有A,B 共2个线程, B线程希望A停下来

A线程在等待锁/睡眠时, 根据自身的业务来决定, 是真的停下来,  还是忽略异常 继续执行

InterruptedException就是这个信号

1.在使用Future类的get方法时是必须处理InterruptedException, 所以可以看看业务设计上有没有被其他线程中断的逻辑,
如果没有 那直接使用Thread.currentThread().interrupt(); sonar就不会标红
或者打印异常的堆栈信息, 记录log等

如果有, 则看看当前业务的重要性, 不重要的同上; 
重要的业务, 肯定是要做业务表failure状态的更新, 给上下游发通知, 资源释放等操作
(代码层面就是 把异常向上抛, 或者catch内处理 资源释放等操作)

===============================================

如果只打印log
因为InterruptedException异常会清除 中断状态, 所以线程任然会继续执行

        Thread thread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("Thread is running...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("Thread is interrupted.");
                }
            }
        });

 所以要重新设置中断标记 Thread.currentThread().interrupt();

当while的条件是true 死循环时, 要记得加上return

public class InterruptExample {

    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("线程运行中...111");

                try {
                    Thread.sleep( 2000);
                } catch (InterruptedException e) {
                    System.out.println("发生中断异常, 异常默认清除了中断标记");

                    // 处理方式1
                    System.out.println("线程被中断了, 退出");
                    return;

                    // 处理方式2
//                    Thread.currentThread().interrupt();
//                    System.out.println("重新设置线程中断标记, 让线程继续运行");
                }
                System.out.println("线程运行中...222");
            }
        });
        thread.start();

        // 主线程等待一段时间后中断子线程
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

处理方式1 和 处理方式2 代表了2种不同的处理方式

============================================================

问: 那能不能手动new一个变量来当中断标记呢?

答: 不能, 如果线程处于sleep()wait()I/O等待等阻塞状态时,代码执行流被冻结, 

阻塞线程将永久无法感知中断请求‌,导致资源无法释放或任务无法终止

所以需要利用异常机制强制唤醒阻塞线程

### 从零开始学习API调用教程 #### 前置条件 为了更好地理解和实践API调用,建议读者已掌握Python的基础语法,并能理解基本代码结构。此外,了解如何利用`pip`工具来安装所需的第三方库也是必要的[^1]。 #### 准备工作环境 确保本地计算机上已经正确配置好Python开发环境,并可以通过命令行或终端执行简单的Python脚本。如果打算使用Postman测试Web API,则需提前下载并熟悉该软件的操作界面[^3]。 #### 安装依赖包 许多API可能需要特定的客户端库来进行交互操作。例如,在处理HTTP请求常用的`requests`库可以简化这一过程。可通过如下指令快速完成安装: ```bash pip install requests ``` #### 编写简单示例程序 下面是一个基于Python编写的简易例子,展示了怎样向指定URL发送GET请求获取资源数据: ```python import requests def fetch_data_from_api(): url = "https://r590608e27.zicp.fun/api/products/1" response = requests.get(url) if response.status_code == 200: data = response.json() print(f"成功接收到的数据: {data}") else: print(f"请求失败,状态码:{response.status_code}") fetch_data_from_api() ``` 此段代码实现了对给定链接发起一次GET类型的网络请求,并尝试解析返回的内容作为JSON对象打印出来;当遇到错误响应则会输出相应的状态码信息以便排查问题所在。 #### 实践练习 鼓励初学者多加动手实验不同的API接口功能,比如更改上述实例中的目标地址为其他公开可用的服务端点,或是探索更多关于POST、PUT等不同种类的方法调用来加深印象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值