关于线程中断的一点思考和探究

谁说我不能喝 提交于 2020-01-17 08:25:20

起因:
项目引入了sonar代码检测工具,检测出代码中关于InterruptException异常的处理存在问题
项目中相关代码如下:

public void demo() {
        RLock rLock = redissonClient.getLock(key);
        boolean tryLock = false;
        try {
            tryLock = rLock.tryLock(0, 5, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            logger.error("tryLock error,", e);
        }
        if (tryLock) {
            try {
                //business code
            } catch (Exception e) {
            } finally {
                if (rLock != null) {
                    try {
                        rLock.unlock();
                    } catch (Exception e) {
                    }
                }
            }
        }
    }

sonar中正确示例

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

可以看出,项目代码在遇到线程中断的异常时,捕获到,然后没有做任何处理
而sonar的示例中,在捕获了中断异常之后,又再次调用了线程的中断方法

为什么呢???

首先我们了解一下,线程中断

Thread.interrupt() 并不是中断一个线程,而是将线程设置为一个中断状态
如果线程的run方法中,没有对线程的中断状态进行判断和处理,那么,单纯的调用interrupt方法是没有任何意义的。
但有些方法中
在这里插入图片描述
这样针对线程的中断状态 做出相应处理,才是线程中断的使用场景
在这里插入图片描述

所以说

个人理解,如果我代码中并没有调用过Thread.interrupted方法,那么理论上 当前线程也不会变为中断状态,
tryLock中之所以方法抛出了线程中断异常,就是因为判断当前线程如果为中断状态则抛出此异常。
所以,不会存在需要处理线程中断异常的问题,代码中捕获然后吃掉就可以了。

但是有些情况,需要利用线程中断状态,优雅的结束某些任务,则对线程中断的状态需要重点处理。

由此问题的延伸:

1、如何优雅的关闭线程池

2、一文搞懂Java线程中断

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!