InterruptedException处理方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SonOfWind0311/article/details/79098600

捕获到InterruptedException到底应该怎么处理?吞掉有什么影响?

所谓的吞掉是指捕获Exception后,不继续抛出Exception,也不设置线程的中断状态。

那么吞掉到底有什么影响?

在Java理论与实践“处理InterruptedException”中这样说的:“如果任务生吞中断请求,则 worker 线程将不知道有一个被请求的中断,从而耽误应用程序或服务的关闭”。

而在网上的说法则多种多样,有的甚至说:“线程并未中断,执行完这条语句之后线程会继续执行while循环”。

首先澄清一下网上的这个说法。这个说法实际上是混淆了代码自身逻辑和InterruptedException自身要求,有混淆视听的感觉。先看一下示例代码:

while(true){  
    try {  
      Thread.sleep(1000);  
    }catch(InterruptedException ex)  
    {
      logger.error("thread interrupted",ex);  
    }   
}   

此处捕获异常后仅仅记录日志,不做任何处理,效果是:“线程并未中断,执行完这条语句之后线程会继续执行while循环”。这太正常了,在while循环内部捕获异常,又不主动退出循环,循环当然继续了。

那么此处是不是break一下就可以了?

break之后起码逻辑上没有问题了,但还不是尽善尽美,仍旧属于“处理InterruptedException”中提到的吞掉Exception的说法。

为什么认为是吞掉Exception?

因为对于InterruptedException而言,到此为止了,线程本身已经没有任何方式和手段可以标识出这个线程被中断了,其他线程无法据此做出进一步处理。

简单来说:线程自身的逻辑由线程自身来保证(比如上面提到的退出while循环),吞掉InterruptedException的影响就是其他线程无法知道本线程被中断了,无法做出相应处理。如果确信没有其他线程依赖于此,那么吞掉也就仅仅是不够完美,将来有相应的场景再做相应处理也就是了。

“相应的处理”推荐的做法有二:

1) 继续抛出InterruptedExeption,由需要处理的线程捕获处理

2) 通过Thread.currentThread().interrupt()方法设置线程状态供需要处理的线程获取判断进行相应处理

猜你喜欢

转载自blog.csdn.net/SonOfWind0311/article/details/79098600