我对Java中的线程相对较新,我注意到每次使用Thread.sleep()时我都要捕获InterrupetdException。
导致这种情况的行为是什么,在我有监控线程的简单应用程序中,我可以忽略异常吗?
答案 0 :(得分:27)
当线程上调用interrupt()时会发生这种情况。 This article by Brian Goetz解释了中断机制以及如何处理InterruptedExceptions:
“对InterruptedException的最常见响应是吞下它 - 捕获它并且什么也不做(或者记录它,这不是更好) - 正如我们将在清单4中看到的那样。不幸的是,这种方法抛弃关于中断发生的重要信息,这可能会影响应用程序取消活动或及时关闭的能力。“
“如果你捕获InterruptedException但不能重新抛出它,你应该保留中断发生的证据[...]。这个任务是通过调用interrupt()来”重新中断“当前线程来完成的。”
答案 1 :(得分:8)
正如其他人所说,它是由正在睡眠的interrupt()
对象上的其他一些调用Thread
的线程引起的。
这简单来说意味着其他一些线程决定取消睡眠线程。 try / catch块在那里,你可以优雅地处理线程的取消,安全地清理任何资源,或者关闭它正在进行的任何操作。
如果你实际上不需要做任何事情,那么是的,你仍然需要一个空的catch块。但那是你的Java ......
答案 2 :(得分:6)
Java Concurrency in Practice中的一些建议:
- 传播异常(可能在某些特定于任务的清理之后),使您的方法也成为可中断的阻塞方法;或
- 恢复中断状态,以便调用堆栈上方的代码可以处理它。
- 只有实现线程中断策略的代码才可以吞下中断请求。通用任务和库代码永远不应吞下中断请求。
答案 3 :(得分:3)
主要情况是有人在您的主题上调用Thread.interrupt()。
如果在你真的没想到的时候抛出RuntimeException可能会更安全,但对于非常简单的情况你可能会忽略它。
答案 4 :(得分:3)
来自javadocs:
Class InterruptedException
线程等待时抛出, 睡觉,或以其他方式暂停 很长时间和另一个线程 使用中断中断它 Thread类中的方法。
希望能回答你的问题。
答案 5 :(得分:-1)
InterruptedException是一个经过检查的异常,所以不幸的是你不能忽略它。在大多数简单的情况下,您不必在catch子句中执行任何操作,因为您确定它不会发生。
来自API
当线程等待,休眠或以其他方式暂停很长一段时间时抛出,另一个线程使用Thread类中的interrupt方法中断它。
答案 6 :(得分:-3)
如果其他一些Thread调用thread.interupt(),那么当线程处于休眠状态时,你将获得异常。是的,您可以将try..catch放在sleep()旁边并忽略它;)