在 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
标志。为什么问这个是因为,
- 这是我的完整程序,没有任何地方中断处理实际 GET 请求响应的任务线程。但是由于我理解的各种因素,可能会发生中断。但是我的要求非常简单,无论我得到什么异常,总是return返回一些默认响应,即使它是
InterruptedException
。因此,即使不恢复标志,我的 intention/requirement 也会完成,即用一些默认响应完成 CompletableFuture
。
- 在我的代码中没有任何地方我要检查
Thread.interrupted()
或 Thread.currentThread().isInterrupted()
因为我不想处理这个因为我的要求已经通过 return 返回默认值得到满足回应。
- 捕获 InterruptedException 并使用一些默认响应完成 Future 后,我不会在此线程(Runnable)中进一步处理任何内容。
- 执行 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 并发实践”中的相关章节。
美好的一天!
由于 SonarQube 报告的错误,我一直在浏览 Java 文档和一些关于正确处理 InterruptedException
的在线资源。但不确定我是否 100% 理解如果 InterruptedException 发生在我们不能为 Ex: Runnable 实现抛出异常的地方,是否总是必须恢复 Interruption flag
状态。
让我们考虑下面复制的演示示例代码,其中主要方法负责启动一些异步 method.The 异步方法使 Http GET 请求和处理(通过采取 runnable
作为 addListener 方法的参数 ) 异步响应。
注意: 现在我的查询是我是否必须在第 35 行恢复 Interruption status
标志。为什么问这个是因为,
- 这是我的完整程序,没有任何地方中断处理实际 GET 请求响应的任务线程。但是由于我理解的各种因素,可能会发生中断。但是我的要求非常简单,无论我得到什么异常,总是return返回一些默认响应,即使它是
InterruptedException
。因此,即使不恢复标志,我的 intention/requirement 也会完成,即用一些默认响应完成CompletableFuture
。 - 在我的代码中没有任何地方我要检查
Thread.interrupted()
或Thread.currentThread().isInterrupted()
因为我不想处理这个因为我的要求已经通过 return 返回默认值得到满足回应。 - 捕获 InterruptedException 并使用一些默认响应完成 Future 后,我不会在此线程(Runnable)中进一步处理任何内容。
- 执行 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 并发实践”中的相关章节。