当前位置: 首页 > 知识库问答 >
问题:

为什么我们不吞下InterruptedException

洪开诚
2023-03-14

我很困惑,无法理解为什么不应该吞掉InterruptedException。

IBM的文章说

当阻塞方法检测到中断并抛出InterruptedException时,它将清除中断状态。如果捕捉到InterruptedException,但无法重新抛出它,则应保留中断发生的证据,以便调用堆栈上更高的代码能够获悉中断,并在需要时对其做出响应

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
           Thread.currentThread().interrupt();//preserve the message
             return;//Stop doing whatever I am doing and terminate

         }
    }
}

还请解释一下上面的规则?

共有1个答案

严劲
2023-03-14

看看这个示例,我们假设它在线程/线程池上下文中运行。

public void run() {
  // Honor interrupts so that you can stop/kill the task
  while (!Thread.currentThread().interrupted()) {
    this.doSomeChunkOfWork();
  }    
}

上面的代码是一个很好的例子,说明了如何编写一个任务,该任务可以被中断并以块的方式处理数据(想想从某个源读取数据并以部分的方式处理数据)。现在让我们假设DoSomeChunkOfWork被中断,并且捕获了一个异常。除非再次设置标志或维护标志的中断状态,否则run方法将无法知道当方法调用返回时调用堆栈深处的处理被中断,这将破坏我们良好的逻辑。

这就是为什么您总是将状态设置回调,以便调用堆栈中的方法知道线程是否真的中断了。我想做一个类比,就是“不要把灰尘扫到地毯下面”。:)

 类似资料:
  • 问题内容: 我是一个完整的初学者。 我已阅读了有关解决方案的Google文档。我在互联网上搜索了同样的内容。 但。一切似乎都是技术性的。 据我了解,.Flush有助于在功能出现时立即执行这些功能,而无需将它们捆绑在一起。 我对吗? 如果不是的话,外行人的含义是什么?并请举一个简单的例子。谢谢。 问题答案: 程序员在希望确保在继续之前将先前代码的输出和/或效果写入电子表格时会使用。如果您不这样做,则

  • 为什么会有例外 静默忽略?我可以看到流在打印后停止,但没有记录任何内容。请注意,问题不是一般的日志配置,因为如果我在我的文件中设置,我会看到很多输出。

  • 本文向大家介绍为什么HTML5里面我们不需要DTD?相关面试题,主要包含被问及为什么HTML5里面我们不需要DTD?时的应答技巧和注意事项,需要的朋友参考一下 先说一下什么是DTD或者说我们为什么在html5之前需要使用DTD 下面是DTD的作用: 通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。 应用程

  • 问题内容: 据我所知,以下两个代码段将达到相同的目的。为什么有块呢? 代码A: 代码B: 问题答案: 如果您未处理的异常被抛出会怎样?(我希望你不会抓到…) 如果从try块内部返回会怎样? 如果catch块引发异常会怎样? 一个代码块确保 无论 您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。

  • 问题内容: 我正在构建一个小型应用程序,并在表之间建立外键关系。但是我对为什么我真的需要这个感到困惑?有什么好处- 在编写不需要执行任何联接的查询时,它对我有帮助吗?这是我的数据库的示例片段: 两者之间存在关键关系。和。 我可以执行这样的查询吗? 既然MySQL应该知道表之间的关系?如果不是,那么外键在数据库设计中的真正功能是什么? 问题答案: 外键提供引用完整性。外键列中的数据经过验证-该值只能