繁体   English   中英

恢复 Java 中的中断标志状态

[英]Restoring Interruption flag status in Java

再会!

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

让我们考虑下面复制的演示示例代码,其中 main 方法负责启动一些异步方法。异步方法使 Http GET 请求和处理(通过将runnable作为 addListener 方法的参数)异步响应。 在此处输入图像描述

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

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

如果我仍然想恢复中断标志状态,有人可以解释为什么要恢复相同的状态,如果我不恢复它,我的代码 go 怎么会出错?

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

对于上述确切场景,对此主题的任何启发/澄清都非常值得赞赏。

提前致谢:)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM