1

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

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

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

首先,有什么具体的技术可以用来诊断吗?其次,是否有任何静态分析工具能够发现这种错误?

4

1 回答 1

3

有什么具体的技术可以用来诊断吗?

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

您总是可以自己中断线程并查看中断标志在退出时是否被清除doWork();。这显然会破坏你的逻辑。

是否有任何静态分析工具能够发现这种错误?

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

于 2013-01-29T23:01:59.117 回答