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