1 回答
TA贡献1784条经验 获得超7个赞
请考虑以下情形:
线程 A 位于方法的内部
run()
FutureTask
线程 B 调用 ,它成功地将状态从 切换到 (在 Java 8 之前)
cancel(true)
RUNNING
CANCELLED
线程 A 完成该方法
run()
线程 B,仍在内部中断线程
cancel(true)
线程 A,现在外面得到一个虚假的中断
FutureTask
新设计通过在尝试中断线程之前为 、 set 和 之后 的 设置 引入不同的状态来解决此问题。然后,在完成后调用以下方法:INTERRUPTING
INTERRUPTED
/**
* 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
…
请注意,这仍不会重置线程的中断状态。这仍然是调用方的职责,例如实现。但是现在可以保证,在取消的情况下,从该方法返回时已经完成了潜在的中断,因此很容易重置标志。如果没有这种保证,在发生不雅的取消的情况下,中断可能会在尝试重置中断状态后发生。ExecutorService
run()
添加回答
举报