处理InterruptedException

时间:2016-03-01 12:34:27

标签: java multithreading interrupted-exception interruption

我正在使用Thread.sleep(10000);因此我需要处理InterruptedException。我可以调用Thread.currentThread.interrupt()然后将异常抛给调用类,或者我可以直接将它抛给调用类,还是有更好的方法来处理它?<​​/ p>

4 个答案:

答案 0 :(得分:2)

如果你有一个循环和轮询的专用线程,那对我来说就像是在程序结束时需要终止的东西;除非它是一个守护程序线程(意味着你很高兴它没有机会清理或关闭资源)它需要能够处理中断。使用WatchService似乎是一个好主意,但使用WatchService的代码仍然必须知道如何处理中断。

如果你正在编写一个可以休眠的Runnable或Callable,你可以使用InterruptedException来退出你正在做的任何循环,或者你可以捕获异常并恢复中断标志,以便下次检查中断标志(使用Thread.currentThread().isInterrupted())可以看到线程已被中断:

while(!Thread.currentThread().isInterrupted()){  
   //do something   
   try{  
     Thread.sleep(5000);    
   } catch(InterruptedException e){  
        Thread.currentThread().interrupt();
   }
}

或者,您可以使用InterruptedException退出循环:

try {
    while (!Thread.currentThread().isInterrupted()) {
        // do something
        Thread.sleep(5000);
    }
} catch (InterruptedException e) {
    // flag value is not used here
    Thread.currentThread().interrupt(); 
}

如果您正在开发一个希望嵌套在其他对象中的对象,则抛出异常并将其添加到方法签名中。作为示例,请查看java.util.concurrent包中的类的API doc,例如BlockingQueue,查看put和offer等方法如何抛出InterruptedException。当为并发创建的对象组合在一起时,他们需要合作(并确保他们不会忘记中断状态),以确保他们能够以响应的方式清理和终止。

答案 1 :(得分:0)

在大多数普通代码中,您不应使用sleep。通常有更好的方法来做你想做的事。

  

我可以调用Thread.currentThread.interrupt()

如果您想要正常继续,但无需等待,这非常有用。

  

然后将异常抛给调用类

或者我会抛出一个异常,你可以用你选择的一个来包装异常。

  

或者我可以直接把它扔给调用类

在这种情况下,您可能不会遇到。

  

还是有更好的方法来处理它吗?

这取决于您期望线程被中断的原因。如果我不期待中断,我用AssertionError

包装它

答案 2 :(得分:0)

一般情况下,如果可以,请重新抛出,或者如果不能重新抛出则设置中断标志。

关于此问题的一篇好文章是http://www.ibm.com/developerworks/library/j-jtp05236/

这是最相关的摘录:

  

当阻塞方法检测到中断并抛出时   InterruptedException,它清除中断状态。如果你抓住了   InterruptedException但不能重新抛出它,你应该保留   证据表明中断发生使代码更高了   调用堆栈可以了解中断并在需要时对其进行响应   到。

答案 3 :(得分:0)

  

我正在使用Thread.sleep(10000);因此我需要处理InterruptedException。

不一定。有一些聪明的方法来处理InterruptedException,并且有一些愚蠢的方法。如果你的线程实际上永远不会被 中断,那么你选择哪种方式真的很重要吗?

当然,如果您认为您的代码可能会被重复使用,或者您认为其他程序员会阅读它,那么您可能希望采用智能方式。如果你想练习良好的编码习惯,你可能想要采用聪明的方式(那里有很多例子,等待谷歌搜索找到)。

但有时我们只是想写一个快速的黑客,我们将使用一次然后扔掉......