未来采取的行动是“在未来之前发生”#isDone调用返回true吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未来采取的行动是“在未来之前发生”#isDone调用返回true吗?相关的知识,希望对你有一定的参考价值。

假设我运行以下函数:

boolean functionWithAsyncTask() {
  boolean[] b = new boolean[1];
  b[0] = false;
  Future<?> f = executorService.submit(() -> {
    b[0] = true;
    return null;
  });
  while (!f.isDone()) {
    // ... do some other work with no synchronization ...
  }
  return b[0];
}

是否保证返回true(假设它完全返回),或者它可能返回false

更抽象的是,我相信这个问题是一样的:Future#isDone返回true是否建立了一个发生在之前的关系,其中异步线程采取的操作发生在 - 调用isDone之后的代码之前?

答案

实际上有两个问题,所以我将分别回答:

是否保证返回true

不可以。只有Future.get()有一个记录在事先保证。此外,这样的保证不可能存在,因为如果任务被取消或抛出异常,isDone()将返回true。

它可能会回归false

如果它正常完成则不行。在标准的FutureTask实现中,isDone()检查volatile字段state,它通常在任务完成后设置,创建一个before-before边缘。

以上是关于未来采取的行动是“在未来之前发生”#isDone调用返回true吗?的主要内容,如果未能解决你的问题,请参考以下文章

对持续触摸采取行动,而不是仅仅在开始 touchesBegan 时采取行动:

TS - 问题解决力 - 下篇

想要对准则2 ORM进行删除时不采取任何行动,而对于更新2则ORM中进行更新时不采取行动

带有 Appium 库的机器人框架:根据当前页面采取行动

如何对日期更改采取行动?

在采取行动的情况下获取单选按钮的选定值