我在ThreadPoolExecutor $ Worker.runTask中找到了这样奇怪的代码
if (runState < STOP && Thread.interrupted() && runState >= STOP)
thread.interrupt();
为什么需要检查runState < STOP
和runState >= STOP
。
有一条评论以某种方式解释了为什么这种双重检查是必要的,但我不明白。
因此要计算表达式的最终值,它将从内存runState中获取,然后调用Thread.interrupted()然后再从内存中获取runState(第一个runState可能与第二个不同?)并将这三个表达式的值与?
答案 0 :(得分:2)
代码的初始目的是清除线程的interrupted
状态,除非它是shuttingDownNow
,所以它必须只是
if (runState < STOP)
Thread.interrupted();
但我们有并发性。考虑两个运行代码的线程Worker
:
if (runState < STOP &&
Thread.interrupted() &&
runState >= STOP)
thread.interrupt();
和执行shutdownNow
的线程:
if (state < STOP)
runState = STOP;
for (Worker w : workers) {
w.interruptNow();
}
现在这是双重检查的情况
Worker: if (runState < STOP && // true for now
shutdownNow: if (state < STOP)
shutdownNow: runState = STOP; // set new state
shutdownNow: for (Worker w : workers) {
shutdownNow: w.interruptNow(); // interrupt
shutdownNow: }
Worker: Thread.interrupted() && // clears interrupted state
Worker: runState >= STOP) // but we have double check
Worker: thread.interrupt(); // that will setup it again