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