处理 InterruptedException 的最佳方法

Best way to handle InterruptedException

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

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

I can call Thread.currentThread.interrupt ()

如果您想像往常一样继续而不等待,这很有用。

and then throw the exception to calling class

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

or i can directly throw it to calling class

这种情况你还不如不抓。

or is there any better way to handle it ?

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

包装它

一般能重抛就重抛,不能重抛就设置中断标志

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

最相关的摘录是:

When a blocking method detects interruption and throws InterruptedException, it clears the interrupted status. If you catch InterruptedException but cannot rethrow it, you should preserve evidence that the interruption occurred so that code higher up on the call stack can learn of the interruption and respond to it if it wants to.

I am using Thread.sleep(10000); hence i need to handle InterruptedException.

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

当然,如果您认为您的代码可能会被重复使用,或者如果您认为其他程序员会阅读它,那么您可能想要采用聪明的方式。如果您想养成良好的编码习惯,您可能需要采用聪明的方式(那里有很多示例,等待通过 google 搜索找到)。

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

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

如果您正在编写休眠的 Runnable 或 Callable,您可以使用 InterruptedException 退出您正在执行的任何循环,或者您可以捕获异常并恢复中断标志,以便下一次检查中断标志(using 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 文档,例如 BlockingQueue,看看 put 和 offer 等方法如何抛出 InterruptedException。当为并发创建的对象组合在一起时,它们需要合作(并确保它们不会失去对中断状态的跟踪),以确保它们能够以响应方式清理和终止。