什么样的行为会导致中断异常?

Oma*_*eji 31 java multithreading exception

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

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

Dan*_*yer 27

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

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

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

  • 谢谢你提出这一点.这是一个必须管理InterruptedExceptions的PITA,但这很重要. (2认同)
  • 很好的参考,但不能完全回答OP的实际问题。重新解释后,它是“为什么一个线程会被中断?”,给出的答案是“因为其他线程决定这样做”。我猜测OP的真正意图是“在较大的Java生态系统中是否会引起这种情况?”。例如System.exit?从main()方法返回?黑子?:-) (2认同)

mad*_*lep 8

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

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

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


jas*_*cao 6

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

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


Jan*_*ann -1

如果其他线程在线程休眠时调用 thread.interupt(),您将收到异常。是的,你可以把 try..catch 放在 sleep() 周围并忽略它;)

  • 降级是因为您“永远”不应该忽略任何异常,这会导致未记录的行为和错误。要么记录它,要么冒泡。 (25认同)
  • 虽然人们绝对不应该忽视大多数例外情况。这是在某些情况下可能被忽略的异常的一个主要示例。例如,当对线程的引用仅存在于范围内时,就不可能出现意外行为。我们是软件工程师,应该独立思考。如果您甚至不问自己为什么处理异常是最佳实践,那么您可能是一个糟糕的工程师。 (3认同)