【问题标题】:What kind of behaviour causes an interrupted exception?什么样的行为会导致异常中断?
【发布时间】:2010-09-18 12:28:17
【问题描述】:

我对 Java 中的线程比较陌生,我注意到每次使用 Thread.sleep() 时,我都必须捕获 InterrupetdException。

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

【问题讨论】:

标签: java multithreading exception


【解决方案1】:

当线程上调用interrupt() 时会发生这种情况。 This article by Brian Goetz 解释了中断机制以及应该如何处理 InterruptedExceptions:

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

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

【讨论】:

  • 感谢您提出这一点。必须管理 InterruptedExceptions 是一个 PITA,但这很重要。
  • 很好的参考,但不能完全回答 OP 的真正问题。重新解释,它是“为什么线程会被中断?”,给出的答案是“因为其他一些线程决定这样做”。我猜 OP 的真正意图是“在更大的 Java 生态系统中有什么东西会导致这种情况吗?”。系统退出?从 main() 方法返回?太阳黑子? :-)
【解决方案2】:

正如其他人所说,这是由其他线程调用 interrupt() 对处于睡眠状态的 Thread 对象引起的。

用简单的英语意味着,其他一些线程已决定取消休眠线程。 try/catch 块在那里,因此您可以优雅地处理线程的取消,并安全地清理任何资源,或关闭它正确执行的任何操作。

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

【讨论】:

    【解决方案3】:

    Java Concurrency in Practice 的一些建议:

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

    【讨论】:

      【解决方案4】:

      来自javadocs

      类 InterruptedException

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

      希望能回答你的问题。

      【讨论】:

        【解决方案5】:

        InterruptedException 是一个检查异常,所以很遗憾你不能忽略它。在大多数简单的情况下,您不必在 catch 子句中做任何事情,因为您确信它不会发生。

        来自 API

        当一个线程等待、休眠或以其他方式暂停很长时间并且另一个线程使用 Thread 类中的中断方法中断它时抛出。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 降级是因为您应该永远忽略任何异常,这会导致未记录的行为和错误。要么记录下来,要么冒泡。
            • 吞下 InterruptedException 会损害应用程序及时取消活动或关闭的能力。更多信息请点击此处ibm.com/developerworks/library/j-jtp05236
            • 虽然绝对不应忽视大多数例外情况。这是在某些情况下可能会被忽略的异常的主要示例。例如,当对 Thread 的引用仅存在于范围内时,就不会出现意外行为。我们是软件工程师,应该为自己思考。如果您甚至不问自己为什么处理异常是最佳实践,那么您可能是一个糟糕的工程师。
            猜你喜欢
            • 1970-01-01
            • 2012-10-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 2010-09-16
            • 2013-03-27
            • 2012-04-20
            相关资源
            最近更新 更多