什么样的行为导致中断的exception?

我对Java中的线程相对较新,我注意到每次使用Thread.sleep()时我都要捕获InterrupetdException。

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

好吧,如果其他一些Thread调用thread.interupt(),当线程处于hibernate状态时,你将获得exception。 是的,您可以将try..catch放在sleep()旁边并忽略它;)

它发生在线程上调用interrupt()的时候。 Brian Goetz的这篇文章解释了中断机制以及如何处理InterruptedExceptions:

“对InterruptedException的最常见响应是吞下它 – 捕获它并且什么也不做(或者记录它,这不是更好) – 正如我们将在清单4中看到的那样。不幸的是,这种方法很重要有关中断发生的信息,这可能会影响应用程序取消活动或及时关闭的能力。“

“如果你捕获InterruptedException但不能重新抛出它,你应该保留中断发生的证据[…]。这个任务是通过调用interrupt()来”重新中断“当前线程来完成的。

来自Java Concurrency in Practice的一些建议:

  • 传播exception(可能在某些特定于任务的清理之后),使您的方法也成为可中断的阻塞方法; 要么
  • 恢复中断状态,以便调用堆栈上的代码可以处理它。
  • 只有实现线程中断策略的代码才可以吞下中断请求。 通用任务和库代码永远不应吞下中断请求。

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

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

如果您实际上不需要执行任何操作,那么是的,您仍然需要一个空的catch块。 但那是你的Java ……

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

抛出RuntimeException可能会更安全,如果它发生在你真的没想到的时候,但对于非常简单的情况你可能会忽略它。

来自javadocs :

Class InterruptedException

当线程等待,hibernate或以其他方式暂停很长一段时间时抛出,另一个线程使用Thread类中的interrupt方法中断它。

希望这能回答你的问题。

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

来自API

当线程等待,hibernate或以其他方式暂停很长一段时间时抛出,另一个线程使用Thread类中的interrupt方法中断它。