起因:
项目引入了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中之所以方法抛出了线程中断异常,就是因为判断当前线程如果为中断状态则抛出此异常。
所以,不会存在需要处理线程中断异常的问题,代码中捕获然后吃掉就可以了。
但是有些情况,需要利用线程中断状态,优雅的结束某些任务,则对线程中断的状态需要重点处理。
由此问题的延伸:
来源:CSDN
作者:雪落南城
链接:https://blog.csdn.net/lbh199466/article/details/103993299