哪种行为会导致中断异常?

What kind of behaviour causes an interrupted exception?

提问人:Omar Kooheji 提问时间:10/22/2008 更新时间:9/2/2013 访问量:18698

问:

我对 Java 中的线程比较陌生,我注意到每次使用 Thread.sleep() 时,我都必须捕获 InterrupetdException。

什么样的行为导致了这种情况,在我有监视线程的简单应用程序中,我可以忽略异常吗?

Java 多线程 异常

评论

0赞 Eric des Courtis 7/8/2013
与这个问题类似:stackoverflow.com/questions/17494717/...

答:

-1赞 Jan Gressmann 10/22/2008 #1

好吧,如果其他线程在线程处于睡眠状态时调用 thread.interupt(),您将获得异常。是的,你可能可以试试。抓住 sleep() 并忽略它;)

评论

25赞 Spencer Kormos 10/23/2008
降级,因为您永远不应该忽略任何异常,这会导致未记录的行为和错误。要么记录它,要么冒泡它。
0赞 Kumar Abhinav 8/6/2014
吞下 InterruptedException 会损害应用程序及时取消活动或关闭信息的能力。更多信息请点击此处 ibm.com/developerworks/library/j-jtp05236
3赞 Eldar Kersebaum 6/28/2017
虽然绝对不应该忽视大多数例外情况。这是在某些情况下可能会忽略的异常的一个典型示例。例如,当对 Thread 的引用仅存在于作用域中时,则不会出现意外行为。我们是软件工程师,应该独立思考。如果你甚至不问自己为什么处理异常是最佳实践,那么你可能是一个糟糕的工程师。
3赞 Jon Skeet 10/22/2008 #2

主要情况是有人在您的线程上调用 Thread.interrupt()。

如果 RuntimeException 发生在您真的没有预料到的情况下,抛出它可能更安全,但对于非常简单的情况,您可能会忽略它。

-1赞 Vincent Ramdhanie 10/22/2008 #3

InterruptedException 是一个经过检查的异常,所以很遗憾,你不能忽略它。在大多数简单的情况下,您不必在 catch 子句中执行任何操作,因为您确信它不会发生。

从 API

当线程等待、休眠或以其他方式长时间暂停,而另一个线程使用 Thread 类中的 interrupt 方法中断它时引发。

3赞 Miguel Ping 10/22/2008 #4

javadocs 中:

类 InterruptedException

当线程正在等待时抛出, 睡觉,或以其他方式暂停 很长一段时间和另一个线程 使用中断中断它 方法。

希望能回答你的问题。

8赞 madlep 10/22/2008 #5

正如其他人所说,它是由其他线程调用正在休眠的对象引起的。interrupt()Thread

用简单的英语来说,这意味着其他一些线程已决定取消休眠线程。try/catch 块在那里,因此您可以优雅地处理线程的取消,并安全地清理任何资源,或关闭它正确执行的任何操作。

如果你实际上不需要做任何事情,那么是的,你仍然需要一个空的捕捉块。但这就是 Java......

30赞 Dan Dyer 10/22/2008 #6

当某些东西在线程上调用 interrupt() 时,就会发生这种情况。Brian Goetz 的这篇文章解释了中断机制以及应如何处理 InterruptedExceptions:

“对 InterruptedException 最常见的反应是吞下它——抓住它,什么都不做(或者记录它,这不会更好)——正如我们稍后将在清单 4 中看到的那样。不幸的是,这种方法会丢弃有关发生中断事实的重要信息,这可能会损害应用程序及时取消活动或关闭的能力。

“如果您捕获 InterruptedException 但无法重新抛出它,则应保留中断发生的证据 [...]。此任务是通过调用 interrupt() 来“重新中断”当前线程来完成的。

评论

2赞 Spencer Kormos 10/23/2008
谢谢你提出这一点。必须管理 InterruptedExceptions 是一个 PITA,但这很重要。
3赞 Charles Roth 3/20/2019
很好的参考,但并没有完全回答 OP 的真正问题。重新解释,它是“为什么一个线程会被打断?”,给出的答案是“因为其他线程决定这样做”。我猜 OP 的真正意图是“在更大的 Java 生态系统中有什么东西会导致这种情况吗?例如 System.exit?从 main() 方法返回?太阳黑子?:-)
7赞 jassuncao 10/22/2008 #7

Java Concurrency in Practice 中的一些建议:

  • 传播异常(可能在一些特定于任务的清理之后),使你的方法也成为可中断的阻塞方法;或
  • 还原中断状态,以便调用堆栈上较高的代码可以处理中断。
  • 只有实现线程中断策略的代码才能吞下中断请求。通用任务和库代码不应吞下中断请求。