使用spring async进行并行调用后连接结果

时间:2015-04-14 23:16:32

标签: java spring asynchronous parallel-processing

我使用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);
                          }
           }
    }

1 个答案:

答案 0 :(得分: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