我有一个java方法需要与不同的输入集(来自列表)并行执行。基本上我的业务逻辑方法有一些外部调用逻辑,消耗很少的时间来响应。为了减少我获得最终响应的总时间,我尝试使用Future和@Async实现并行调用此方法。以下是我的示例代码:
控制器类:
List<Future<ResponseObj>> futuresResObj = new ArrayList<Future<ResponseObj>>();
Future<ResponseObj> report = null;
for(int i=0 ; i<idList.size() ; i++){
request.setId(idList.get(i));
System.out.println("i Value::::"+i);
report = parallelService.executeBusinessMethod(request,i);
futuresResObj.add(report);
}
System.out.println("futuresResObj list Size ::::"+futuresResObj.size());
for(Future<ResponseObj> future: futuresResObj) {
System.out.println(future.get().getResObj()); // concurrent access excpetion throws here.
}
我的服务类:
@Service
public class ParallelService {
@Autowired
Properties properties;
@Async
public Future<ResponseObj> executeBusinessMethod(RequestObj request , int count) throws InterruptedException,Exception {
System.out.println ("Start executeBusinessMethod:::: "+count);
ResponseObj responseObj=null;
// Do invoke many external calls( Consumes little time to complete).
return new AsyncResult<ResponseObj>(responseObj);
}
}
但是上面的实现并没有像我预期的那样工作,也没有返回所有的响应。获取超时和断电。
有没有其他方法可以实现上述目标..?请帮我这个..!
框架:Spring 4.0.9.RELEASE
答案 0 :(得分:0)
其他一些线程可能会在你的futuresResObj
列表中添加更多的期货,而执行是在阻塞循环中等待所有线程完成,尝试添加一些日志语句,也尝试等待未来System.out.println
之外的未来
System.out.println("futuresResObj list Size::::"+futuresResObj.size());
for(Future<ResponseObj> future: futuresResObj) {
future.get();
}
您也可以使用future.isDone()
方法进行测试,以了解这些线程的行为方式。