未来采取的行动是“在未来之前发生”#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 时采取行动: