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

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

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

我有一个替代方法

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

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

获取所有实现一个具有方法fetchData的接口的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->{
    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中,我总是得到2个对象,但是fetchData正在运行5次(基于实例数),在所有剩余的异步调用都完成之后,我看到了日志。有人可以在这里提供帮助。

观察:-将主线程置于睡眠状态30秒钟后,我可以看到列表中有所有5个对象。能否请一个人告诉我为什么主线程根本不等待所有交易完成。

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

java multithreading asynchronous completable-future
1个回答
0
投票

您有比赛条件:

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