使用Future和@Async并行执行与不同输入并行的相同方法

时间:2017-05-01 21:43:53

标签: java spring asynchronous futuretask

我有一个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

1 个答案:

答案 0 :(得分:0)

其他一些线程可能会在你的futuresResObj列表中添加更多的期货,而执行是在阻塞循环中等待所有线程完成,尝试添加一些日志语句,也尝试等待未来System.out.println之外的未来

System.out.println("futuresResObj list Size::::"+futuresResObj.size());
for(Future<ResponseObj> future: futuresResObj) {
    future.get();
 }

您也可以使用future.isDone()方法进行测试,以了解这些线程的行为方式。