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

问题描述 投票:-1回答:1

假设我运行以下函数:

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之后的代码之前?

java synchronization
1个回答
1
投票

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

是否保证返回true

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

它可能会回归false

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

© www.soinside.com 2019 - 2024. All rights reserved.