为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2022-09-28 10:11:31
为什么未来任务在 jdk8 中不再在内部使用 AQS,而不是 jdk7?在jdk 8评论中说,它已经完成:“避免用户在*取消比赛期间保留中断状态的惊讶”我想知道更多关于该用例的信息,如果有一个不需要的行为的例子,这个变化可以修复。
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

请考虑以下情形:

  • 线程 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()



查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信