请考虑以下情形:线程 A 位于方法的内部run()FutureTask线程 B 调用 ,它成功地将状态从 切换到 (在 Java 8 之前)cancel(true)RUNNINGCANCELLED线程 A 完成该方法run()线程 B,仍在内部中断线程cancel(true)线程 A,现在外面得到一个虚假的中断FutureTask新设计通过在尝试中断线程之前为 、 set 和 之后 的 设置 引入不同的状态来解决此问题。然后,在完成后调用以下方法:INTERRUPTINGINTERRUPTED/** * Ensures that any interrupt from a possible cancel(true) is only * delivered to a task while in run or runAndReset. */private void handlePossibleCancellationInterrupt(int s) { // It is possible for our interrupter to stall before getting a // chance to interrupt us. Let's spin-wait patiently. if (s == INTERRUPTING) while (state == INTERRUPTING) Thread.yield(); // wait out pending interrupt…请注意,这仍不会重置线程的中断状态。这仍然是调用方的职责,例如实现。但是现在可以保证,在取消的情况下,从该方法返回时已经完成了潜在的中断,因此很容易重置标志。如果没有这种保证,在发生不雅的取消的情况下,中断可能会在尝试重置中断状态后发生。ExecutorServicerun()