为什么未来任务不再在内部使用AQS?

为什么未来任务在 jdk8 中不再在内部使用 AQS,而不是 jdk7?

在jdk 8评论中说,它已经完成:“避免用户在*取消比赛期间保留中断状态的惊讶”

我想知道更多关于该用例的信息,如果有一个不需要的行为的例子,这个变化可以修复。


月关宝盒
浏览 87回答 1
1回答

噜噜哒

请考虑以下情形:线程 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java