诊断Java中断标志

时间:2013-01-29 22:53:58

标签: java multithreading interrupted-exception

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

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

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

首先,我可以用任何特定的技术来诊断这个吗?其次,是否有任何静态分析工具可以发现这种错误?

1 个答案:

答案 0 :(得分:3)

  

我可以使用任何特定的技术来诊断这个吗?

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

你总是可以自己中断线程,看看中断标志是否在从doWork();退出时被清除。这显然会搞砸你的逻辑。

  

有没有能够发现这种错误的静态分析工具?

我不知道。其中一个分析器可能足够聪明,可以捕获线程中断。