假设我运行以下功能:
public boolean removeBoat(String boatId) {
System.out.println(">>> Deleting boat.");
Boat b = findBoatById(boatId);
if( b != null ){
this.dock.getDockedBoats().remove(b);
return true;
}
return false;
}
public Boat findBoatById(String boatId) {
System.out.println(">>> Find boat from list.");
for( Boat b : this.dock.getDockedBoats() ){
if( boatId.equalsIgnoreCase( b.boatId ) ){
return b;
}
}
return null;
}
是否保证返回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
建立一个先发生关系,异步线程采取的操作发生在调用{之后的代码之前{1}}?
答案 0 :(得分:1)
实际上有两个问题,所以我将分别回答:
是否保证返回
true
没有。只有Future.get()
有发生前保证。此外,这样的保证不可能存在,因为如果任务被取消或引发异常,isDone()
将返回true。
可能会返回
false
吗?
如果正常完成则不行。在标准FutureTask
实现中,isDone()
检查volatile字段state
,该字段通常在任务完成后设置,创建发生在边缘之前。