【问题标题】:joining results after making parallel calls using spring async使用spring async进行并行调用后加入结果
【发布时间】:2015-04-14 23:16:32
【问题描述】:

我正在使用 spring @Async 对同一方法/后端进行并行调用。有没有一种干净的方法可以将他们的结果加入列表中?这是我提出的用于调用/合并结果的伪代码,但我不确定这是最干净的方式。

List<Future<String>> futureStringList = new ArrayList<Future<String>>();
for(each backend call){
           Future<String> futureString = backend.retrieve();
           futureStringList.add(futureString);
}


List<String> actualStringList = new ArrayList<String>();

    while(!futureStringList.isEmpty()){
           for(Future<String> futureString: futureStringList){
                          if(futureString.isDone()){
                                         actualStringList.add(futureString.get());
                                         futureStringList.remove(futureString);
                          }
           }
    }

【问题讨论】:

    标签: java spring asynchronous parallel-processing


    【解决方案1】:

    Future.get() 是一个阻塞调用,因此您实际上可以遍历您的 Future 列表,并且您知道,在循环结束时,您所有的未来都完成了。

    List<Future<String>> futureStringList = new ArrayList<Future<String>>();
    for(each backend call){
        Future<String> futureString = backend.retrieve();
        futureStringList.add(futureString);
    }
    
    List<String> actualStringList = new ArrayList<String>();
    for (Future<String> stringFuture : futureStringList) {
      actualStringList.add(stringFuture.get()); // blocking call
    }
    
    // all your Strings are retrieved at this point
    

    【讨论】:

    • 我实际上是在试图避免阻塞 for 循环,这就是为什么我将 while 循环放在它周围。
    • 为什么?在您的代码中,线程也卡在循环中并消耗大量 CPU(不必要地)。
    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多