我有一些看起来像这样的代码:
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/