在 Java 中恢复中断标志状态

Restoring Interruption flag status in Java

美好的一天!

由于 SonarQube 报告的错误,我一直在浏览 Java 文档和一些关于正确处理 InterruptedException 的在线资源。但不确定我是否 100% 理解如果 InterruptedException 发生在我们不能为 Ex: Runnable 实现抛出异常的地方,是否总是必须恢复 Interruption flag 状态。

让我们考虑下面复制的演示示例代码,其中主要方法负责启动一些异步 method.The 异步方法使 Http GET 请求和处理(通过采取 runnable作为 addListener 方法的参数 ) 异步响应。

注意: 现在我的查询是我是否必须在第 35 行恢复 Interruption status 标志。为什么问这个是因为,

  1. 这是我的完整程序,没有任何地方中断处理实际 GET 请求响应的任务线程。但是由于我理解的各种因素,可能会发生中断。但是我的要求非常简单,无论我得到什么异常,总是return返回一些默认响应,即使它是InterruptedException。因此,即使不恢复标志,我的 intention/requirement 也会完成,即用一些默认响应完成 CompletableFuture
  2. 在我的代码中没有任何地方我要检查 Thread.interrupted()Thread.currentThread().isInterrupted() 因为我不想处理这个因为我的要求已经通过 return 返回默认值得到满足回应。
  3. 捕获 InterruptedException 并使用一些默认响应完成 Future 后,我不会在此线程(Runnable)中进一步处理任何内容。
  4. 执行 InterruptedException catch 块后,接下来我的主线程将开始执行接收到的默认响应。我的主线程或父线程不想知道或不关心 InterruptedException 是否发生过。它只关心一些有效的响应。

Incase if I still want to restore the Interruption flag status, could someone please explain why to restore the same, and how can my code go wrong if I don't restore it?

。因为,正如我上面4点所说,即使不恢复标志,我的要求也得到了满足。

任何关于上述确切场景的主题的 enlightment/clarification 都非常值得赞赏。

提前致谢:)

在您的程序中,您可能确实不需要处理 InterruptedException

但在一般情况下吞咽 InterruptedException 是个坏主意。
主要原因是Thread.interrupt()(导致InterruptedException)是中断Java标准库提供的许​​多阻塞操作的唯一方法。

例如,当我们想要正常关闭我们的应用程序时(即当我们想要在关闭前关闭文件、网络连接和其他资源时),通常需要正确处理 InterruptedException

有关此的一些信息可以在 Thread.interrupt() javadocs 中找到。

另外,我会推荐 this SO answer 和那里提到的“Java 并发实践”中的相关章节。