gpt4 book ai didi

java - 为什么主线程不等待其他异步进程(线程)完成。 allOff 无法正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:41 26 4
gpt4 key购买 nike

我在 for 循环中调用一个异步方法并将它的 future 添加到列表中。我不确定为什么 allOff 不等待完成所有 future 并返回部分结果。看看我的代码。

我有一个重写的方法

@Overide
@Async
CompletableFuture<someType> fetchData()
{
returns new CompletableFuture<someType>();
}

我在不同实例的 for 循环中调用上述方法。

获取所有实现一个接口(interface)的 bean,该接口(interface)具有方法 fetchData。

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 以便所有 future 都可以完成,但它不会等待所有和主线程执行剩余的流程。

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 次(基于实例数),我在所有剩余的异步调用完成后看到了日志。有人可以帮忙吗。

观察:- 在让主线程 hibernate 30 秒后,我可以看到列表中有所有 5 个对象。谁能告诉我为什么主线程根本不等待所有 future 完成。

最佳答案

IIUC,你想做的事可以做的更简单

CompletableFuture<List<FutureResponse>> = CompletableFuture.supplyAsync(() -> {
// start fetches and collect the individual futures
List<CompletableFuture> fetches =
allBeans.values().stream()
.map(SomeClass::fetchData)
.collect(toList());
// join all futures and return the list of the results
return fetches.stream()
.map(CompletableFuture::join)
.collect(toList());
}

我认为您不能在单个流中执行此操作(即映射到 fetch,然后立即映射到 join),因为这可能会在下一个流之前等待连接 future 已创造。

关于java - 为什么主线程不等待其他异步进程(线程)完成。 allOff 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58376577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com