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

如果没有人调用interrupt(),忽略InterruptedException可以吗?

薛高澹
2023-03-14

如果我创建了自己的线程(即不是线程池),并且在某个地方调用sleep或任何其他可中断的方法,如果我知道代码中没有其他人在线程上执行中断,那么忽略InterruptedException是否可以。

换句话说,如果线程应该和JVM一样长,这意味着线程是不可中断的,那么假设InterruptedException永远不会被调用,从而可以吞噬异常,这样做是否安全

共有1个答案

沈皓君
2023-03-14

忽略检查的异常永远不会被认为是安全的。
现在对您来说可能是可以的,但是如果另一个程序员扩展了您的代码,他会期望标准的行为:线程对中断调用作出反应。
在这种情况下,空的catch块也是危险的,因为JVM会删除中断标志,并且肯定应该用

Thread.currentThread().interrupt();

在catch块中。在我看来,这是interruptedexceptions的最小捕获实现。在循环中检查isinterrupted标志也不会有太大的影响。
与您未来的程序员自己相比,它的开销很小,因为您的项目可能已经增长了一些,您需要花一两天的时间来搜索意外的线程行为。

如果您觉得代码的可读性受到这些catch实现的影响,您可以实现自己的safesleep实用程序方法,该方法处理exception并正确设置标志。

另一方面,interruptedexception不是由JVM本身在发生硬件故障时抛出的,它只是用户指示的exception 因此,如果不传播 thread的引用,则不会有任何其他 thread能够在其上调用 thread.interrupt()技术上就是这样。但是您不应该低估人为因素和程序的演变。
编辑:正如ruakh指出的,实际上有一种方法可以获得thread的引用,从而调度thread.interrupt()调用。这样,开发人员甚至不必查看实现不中断的线程的类。在我看来,这甚至是实现正确异常处理的另一个原因。
另一件事:如果您没有抛出异常,那么在信息以外的级别记录这样的事件可能是一个不错的选择。

 类似资料:
  • 我正在我的一个应用程序中使用新的android导航框架。应用程序的目的是充当启动器。 有时,当我尝试更改片段(使用navcontroller导航)时,它不会更改片段,而是记录下来 我知道之前有人问过这个问题,忽略navigate()调用:FragmentManager已经保存了它的状态,但没有解决方案。 我使用以下代码导航: Navigation.findNavController(视图)。id.

  • 问题内容: 在JUnit中,您可以使用before方法来告诉测试运行器自动跳过那些测试。据我所知,这实际上只是记录/标记不完整的/不再需要的功能测试的一种便捷方法,您需要稍后再返回。 那么,我是否正确地说,在运行时,测试,没有注释的方法和注释掉的方法之间没有区别?(假设这些测试都是自包含的。)是否可以通过某种方法在Netbeans的JUnit中获取被忽略的测试用例的列表?如果没有,该标签实际上有多

  • 问题内容: 我有一个Dockerfile。生成映像时,由于以下错误而生成失败: 这实际上是无害的。该库可以很好地构建,但是Docker在收到此错误后会停止构建。有什么办法可以指示Docker忽略这一点? 问题答案: 当然。Docker只是响应shell脚本中返回的错误代码。如果您有以下内容: 您可以将其替换为: 这将始终返回(成功)退出代码。这里的缺点是,你的形象将出现,成功地构筑即使 是 在构建

  • 问题内容: 我已阅读并重新阅读了《 Java Concurrency in Practice》,在此主题中阅读了多个线程,阅读了IBM文章《处理InterruptedException》,但我根本不了解某些我认为可以打破的东西。分为两个问题: 如果我从来没有自己打过其他线程,什么会触发 InterruptedException ? 如果我从未使用自己的 interrupt() 中断其他线程(例如,

  • 我已经阅读了前面的所有主题以及关于如何使用命令提示符的建议。但让我们来看看windows用户。 我正在使用GitHub桌面,只是从站点简单安装 我没有访问命令提示版Git的权限。我有.idea文件夹要排除在跟踪范围之外。知道怎么做吗?