我有一些看起来像这样的代码:
executorService.submit(new Runnable() {
@Override public void run() {
while (!Thread.currentThread().isInterrupted()) {
doWork();
}
}
});
此代码有时无法退出while循环,因为在doWork()
内的某处清除了中断标志。这种方法调用第三方库,其中一个是吞噬中断。
首先,我可以用任何特定的技术来诊断这个吗?其次,是否有任何静态分析工具可以发现这种错误?
答案 0 :(得分:3)
我可以使用任何特定的技术来诊断这个吗?
您可以扩展Thread
并覆盖interrupt()
方法以设置您自己的内部中断标志。然后你可以在'doWork()`完成后比较你的内部标志和线程状态,看看它们是否不同。
你总是可以自己中断线程,看看中断标志是否在从doWork();
退出时被清除。这显然会搞砸你的逻辑。
有没有能够发现这种错误的静态分析工具?
我不知道。其中一个分析器可能足够聪明,可以捕获线程中断。