我在 for 循环内调用一个异步方法,并将其 future 添加到列表中。我不确定为什么 allOff 不等待完成所有 future 并返回部分结果。看看我的代码。
我有一个被重写的方法
@Overide
@Async
CompletableFuture<someType> fetchData()
{
returns new CompletableFuture<someType>();
}
我在不同实例的 for 循环中调用上述方法。
获取所有实现具有 fetch Data 方法的接口的 bean。
Map<String, SomeClass> allBeans =context.getBeansOfType(SomeClass.class);
List<SomeClass> list=
allBeans.values().stream().collect(SomeClass.toList());
for (SomeClass classInstance: list) {
classInstance.fetchData().thenApply(x->{
//Some DB persistence Call
futureList.add(x);
});
}
之后,我应用 allOff 以便所有未来都可以完成,但它不会等待所有主线程执行其余流程。
CompletableFuture<Void> combinedFutures = CompletableFuture.allOf(
futureList.toArray(new CompletableFuture[futureList.size()]));
CompletableFuture<List<futureResponse>> finalList=
combinedFutures.thenApply(v -> {
return futureList.stream().map(m ->
m.join()).collect(Collectors.toList());
});
FinalList-在此列表中,我希望 fetch 返回所有已完成的 future
调用。
在 FinalList 中,我总是得到 2 个对象,但 fetchData 运行了 5 次(基于实例数量),我在所有剩余的异步调用完成后看到了日志。有人可以帮忙吗?
观察:- 将主线程置于睡眠状态 30 秒后,我可以看到列表中包含所有 5 个对象。有人可以告诉我为什么主线程根本不等待所有 future 完成吗?