java - 诊断 Java 中断标志

标签 java multithreading interrupted-exception

我有一些看起来像这样的代码:

executorService.submit(new Runnable() {
    @Override public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            doWork();
        }
    }
});

此代码有时无法退出 while 循环,因为中断标志在 doWork() 内某处被清除。此方法调用第三方库,其中之一是吞噬中断。

首先,我可以使用任何特定技术来诊断此问题吗?其次,是否有任何静态分析工具能够发现此类错误?

最佳答案

are there any specific techniques I could use to diagnose this?

您可以扩展Thread 并覆盖interrupt() 方法来设置您自己的内部中断标志。然后,您可以在“doWork()”完成后将内部标志与线程状态进行比较,看看它们是否不同。

您总是可以自己中断线程,并查看当它从 doWork(); 退出时中断标志是否被清除。这显然会打乱您的逻辑。

are there any static analysis tools that would be able to spot this sort of bug?

据我所知没有。其中一个分析器可能足够聪明,可以捕获线程中断。

关于java - 诊断 Java 中断标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593572/

相关文章:

java - 我如何才能防止 LogCat 接收到我手机上的所有内容?

java - 如何从用户交互中生成新变量?

c++ - 在 C++/CLI 代码中包含的代码中使用 <thread>。寻找更好的解决方案

linux - save_stack_trace_tsk 和 struct stack_trace 在 Linux 5.2+ 中不再可用

multithreading - 功能语言中的并行性

java - 使用 Ektorp 调用 createAttachment 与 CouchDB 交互时出现 ClientProtocolException

java - 执行 org.apache.maven.plugins :maven-war-plugin:2. 1.1:war 时缺少必需的类

java - 在调用 EJB 方法时中断客户端线程的正确方法是什么?

java - JVM catch InterruptedException 时是否需要退出

java - Android 上的 java.io 方法是否会抛出 InterruptedIOException?