InterruptedException 时应该如何处理

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

当前的做法: 

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

推荐的做法

方式1: 抛出异常
方式2: 调用Thread.currentThread().interrupt();, 恢复线程中断状态ClearInterrupted的值

    public static void main(String[] args) throws InterruptedException {

        System.out.println("main start...");

        Thread thread = new Thread(() -> {

            while (true) {
                // 手动结束
                // if(Thread.currentThread().isInterrupted()){
                //    System.out.println("thread close...");
                //    break;
                // }
                System.out.println("thread run...");

                try {
                    Thread.sleep(1000);
                    System.out.println("thread 具体业务...");
                } catch (InterruptedException e) {
                    e.printStackTrace(); // 方式A
                    // 注释1
                    // throw e; // 方式1
                    // Thread.currentThread().interrupt(); // 方式2
                }
            }
        });
        thread.start();

        System.out.println("main wait...");
        Thread.sleep(2000);
        thread.interrupt();
        System.out.println("main end...");
    }

上述代码实现了, 主线程 对thread的模拟中断
注释1, 是针对出现InterruptedException时的处理, 由于异常捕获时会使得
           ClearInterrupted的值变为false, 所以需要手动调用interrupt()来重新改为true

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

2种方式的区别
1是交给调用者处理
2是线程自行处理

由于上面的例子, 用了while循环, 所以必须要注意退出逻辑的写法, 
(如果没有退出 容易造成死循环)
也正因为是需要写退出逻辑, interrupt()和isInterrupted()才有意义
否则跟方式A相比, 没有区别



 

你可能感兴趣的:(java,开发语言)