处理多个异步操作并处理每个操作以进行进一步处理的最佳方法是什么?
What is best way to process multiple Async operation and handle each for further processing?
在我的项目中,有一个 return 类型的 Future 列表的方法。
这位其他开发人员已经迭代了 for 循环
public List<Future<Object>> method1(){
List<Future<Object>> lists = new ArrayList();
for(MultipartFile file : files){
Future<Object> future = service.method2(file);
lists.add(future);
}
return lists;
}
现在我必须尽快对列表的对象执行某些操作
处理。我该怎么做?即使我像
这样放一个 for 循环
for(Future<Object> future : lists){
if(future.isDone()){
performOtherOperation(future.get());
}
}
如果第一个对象未被处理,isDone() 条件将失败并被忽略,第二次迭代将开始,我该如何处理?
这也可以使用 ExecutorService 来完成吗??我对 ExecutorService 不熟悉。
编辑:所以我从
编辑了服务class的方法2(文件)
public Future<Object> method2(File){
object = operation();
return new AsyncResult(object);
}
到
public CompletableFuture 方法 2(文件);
但是我应该选择什么 return 类型,它相当于 AsyncResult。
AsyncResult 是 Spring 框架的一个实现。
在我 100% 确定它不会破坏或降低现有的多线程性能之前,我无法修改此代码。
如果能把service.method2
改成return一个CompletableFuture
,那么问题就变得微不足道了:
for(CompletableFuture<Object> future : lists){
future.whenComplete((obj, err) -> performOtherOperation(obj));
}
如果您绝对不能修改 method2,那么您可以按照 Transform Java Future into a CompletableFuture
中所述将 Future 对象转换为 CompletableFutures
在我的项目中,有一个 return 类型的 Future 列表的方法。 这位其他开发人员已经迭代了 for 循环
public List<Future<Object>> method1(){
List<Future<Object>> lists = new ArrayList();
for(MultipartFile file : files){
Future<Object> future = service.method2(file);
lists.add(future);
}
return lists;
}
现在我必须尽快对列表的对象执行某些操作 处理。我该怎么做?即使我像
这样放一个 for 循环for(Future<Object> future : lists){
if(future.isDone()){
performOtherOperation(future.get());
}
}
如果第一个对象未被处理,isDone() 条件将失败并被忽略,第二次迭代将开始,我该如何处理?
这也可以使用 ExecutorService 来完成吗??我对 ExecutorService 不熟悉。
编辑:所以我从
编辑了服务class的方法2(文件)public Future<Object> method2(File){
object = operation();
return new AsyncResult(object);
}
到 public CompletableFuture 方法 2(文件);
但是我应该选择什么 return 类型,它相当于 AsyncResult。 AsyncResult 是 Spring 框架的一个实现。
在我 100% 确定它不会破坏或降低现有的多线程性能之前,我无法修改此代码。
如果能把service.method2
改成return一个CompletableFuture
,那么问题就变得微不足道了:
for(CompletableFuture<Object> future : lists){
future.whenComplete((obj, err) -> performOtherOperation(obj));
}
如果您绝对不能修改 method2,那么您可以按照 Transform Java Future into a CompletableFuture
中所述将 Future 对象转换为 CompletableFutures