提问人:Omar Kooheji 提问时间:10/22/2008 更新时间:9/2/2013 访问量:18698
哪种行为会导致中断异常?
What kind of behaviour causes an interrupted exception?
问:
我对 Java 中的线程比较陌生,我注意到每次使用 Thread.sleep() 时,我都必须捕获 InterrupetdException。
什么样的行为导致了这种情况,在我有监视线程的简单应用程序中,我可以忽略异常吗?
答:
好吧,如果其他线程在线程处于睡眠状态时调用 thread.interupt(),您将获得异常。是的,你可能可以试试。抓住 sleep() 并忽略它;)
评论
主要情况是有人在您的线程上调用 Thread.interrupt()。
如果 RuntimeException 发生在您真的没有预料到的情况下,抛出它可能更安全,但对于非常简单的情况,您可能会忽略它。
InterruptedException 是一个经过检查的异常,所以很遗憾,你不能忽略它。在大多数简单的情况下,您不必在 catch 子句中执行任何操作,因为您确信它不会发生。
从 API
当线程等待、休眠或以其他方式长时间暂停,而另一个线程使用 Thread 类中的 interrupt 方法中断它时引发。
从 javadocs 中:
类 InterruptedException
当线程正在等待时抛出, 睡觉,或以其他方式暂停 很长一段时间和另一个线程 使用中断中断它 方法。
希望能回答你的问题。
正如其他人所说,它是由其他线程调用正在休眠的对象引起的。interrupt()
Thread
用简单的英语来说,这意味着其他一些线程已决定取消休眠线程。try/catch 块在那里,因此您可以优雅地处理线程的取消,并安全地清理任何资源,或关闭它正确执行的任何操作。
如果你实际上不需要做任何事情,那么是的,你仍然需要一个空的捕捉块。但这就是 Java......
当某些东西在线程上调用 interrupt() 时,就会发生这种情况。Brian Goetz 的这篇文章解释了中断机制以及应如何处理 InterruptedExceptions:
“对 InterruptedException 最常见的反应是吞下它——抓住它,什么都不做(或者记录它,这不会更好)——正如我们稍后将在清单 4 中看到的那样。不幸的是,这种方法会丢弃有关发生中断事实的重要信息,这可能会损害应用程序及时取消活动或关闭的能力。
“如果您捕获 InterruptedException 但无法重新抛出它,则应保留中断发生的证据 [...]。此任务是通过调用 interrupt() 来“重新中断”当前线程来完成的。
评论
Java Concurrency in Practice 中的一些建议:
- 传播异常(可能在一些特定于任务的清理之后),使你的方法也成为可中断的阻塞方法;或
- 还原中断状态,以便调用堆栈上较高的代码可以处理中断。
- 只有实现线程中断策略的代码才能吞下中断请求。通用任务和库代码不应吞下中断请求。
评论