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

哪种代码可以接受interruptedException?

贺聪
2023-03-14

我在实践中读到了一致性。现在我想了解如何处理InterruptedException

来自书籍的建议:

-传播异常(可能在特定于任务的清理之后),使您的方法也成为可中断的阻塞方法;或者,恢复中断状态,以便调用堆栈中更高级别的代码可以处理它
-只有实现线程中断策略的代码才能吞咽中断请求。通用任务和库代码绝不应吞没中断请求。

前两种说法我很清楚,但第三种我不明白。你能澄清一下吗?最好提供示例。

吞下中断是可以接受的一次是当您知道线程即将退出时。这种情况只发生在调用可中断方法的类是Thread的一部分,而不是Runnable或通用库代码的时候,如清单5所示。它创建一个枚举素数直到被中断的线程,并允许线程在中断时退出。素数搜索循环在两个地方检查中断:一次是通过轮询time循环头中的isInterunc()方法,一次是当它调用阻塞BlockingQueue.put()方法时。

public class PrimeProducer extends Thread {
    private final BlockingQueue<BigInteger> queue;

    PrimeProducer(BlockingQueue<BigInteger> queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            BigInteger p = BigInteger.ONE;
            while (!Thread.currentThread().isInterrupted())
                queue.put(p = p.nextProbablePrime());
        } catch (InterruptedException consumed) {
            /* Allow thread to exit */
        }
    }

    public void cancel() { interrupt(); }
}

我现在不明白加粗的文字。

共有3个答案

牧宁
2023-03-14

假设我们编写了一个实用程序代码,并且有一些依赖于我们的代码的临床代码。如果发生InterruptedException,它不应该在实用程序方法中消耗(在try块中),它应该被抛出,并且当InterruptedException清除中断标志时,它必须通过调用中断方法再次设置为true。

它是需要处理在发生中断异常时要做出的决定的核心代码。该核心代码可能取决于中断标志或中断异常来终止循环、结束线程的执行或任何其他决定。

此外,实用程序或库是从高级客户端代码调用的低级代码。理想情况下,低级别应该发布这样的异常,以便让更高级别的代码管理它。

宋岳
2023-03-14

ExecutorService将是第三条语句的示例。

这协调在同一个“实际”线程上执行多个runnables(/allables)。

如果一个runnable在执行时被中断,则该中断不应影响后续runnable的执行。

因此,ExecutorService应该吞下中断,从中断的可运行性的角度对其进行适当的处理,以便允许在下一次可运行时重用线程。

杜鸿彩
2023-03-14

简而言之:如果你能处理好这种情况,就可以吞下它。

中断的异常发生在该并行线程中发生的进程被取消或中断时。因此,如果您是唯一对该事实感兴趣的人,并且您可以处理该线程“死”的情况,那么您可以吞下它。

这在现实生活中是完全可能的。策略取决于每种情况。

 类似资料:
  • 问题内容: 在哪里可以找到javax.crypto源代码? --update 感谢OpenJdk版本,但是jdk6版本呢? 问题答案: 下载链接 http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/javax/crypto(OpenJDK版本) http://download.java.net/jdk6/sourc

  • 问题内容: 我试图在glibc源代码中找到select()源代码(Linux,i386架构),但我找不到任何东西(与所述体系结构有关) 谁能指出我的select()源代码? 问题答案: select()不是libc的函数,而是内核函数,因此您需要查看内核源代码。 您可以通过查看手册页来说明这一点:如果在第2节中,则为内核函数;如果在第3节中,则为标准C库的函数,在您的情况下为glibc。 编辑:像

  • 问题内容: 我想看看Java API中的方法是做什么的。所以我想要JDK源代码。在重新安装Linux之前,我先安装了包含所有正式源代码的软件包。我只需要告诉Eclipse这个文件在哪里,就可以看到代码。但是现在我没有文件了… 所以问题是:在哪里可以找到它? 问题答案: 你尚未说出所需的版本, JDK 8源代码的存档以及JDK 7和JDK 6。 此外,你可以浏览或克隆的Mercurial库:8,7,

  • 问题内容: 我正在搜索rt.jar的源代码以获取Oracle JRE / JDK 6 Update22。交付随附的src.zip并不包含所有源代码,例如sun。*(例如sun.reflect.Reflection)。 )包丢失。 在哪里可以获得完整的src.zip? 问题答案: 这个答案写于2010年,当时世界大不相同。如果仅需要JRE类的源代码,请在JDK构建中使用JRE-包括的src.zip文

  • 问题内容: 我想尝试查找Python标准库中某些模块的源代码,但找不到它们。下载python tarball后,我尝试在modules目录中查找,但是它主要包含.c文件。我还尝试查看了OS(mac osx)随附的python所在的目录,该目录中包含它的模块,并且那里似乎主要包含.pyc和.pyo文件。如果有人可以帮助我,我将不胜感激。 (我尝试了问题“如何找到Python模块源的位置?”中的建议,

  • valgrind快速启动页面提到: 这将我引向这样一个问题:是否有充分的理由不在生产中从程序中消除这样的错误?发布包含此类错误的程序有什么好处吗?如果有,开发人员如何保护它的安全,尽管据我所知,包含此类错误的程序可以不可预测地运行,并且无法对其行为做出一般假设?如果是这样,你能提供真实世界的例子,说明程序运行时有这些错误比没有错误更好吗?