Java中与未来相关的澄清

时间:2016-06-14 11:58:51

标签: java executorservice threadpoolexecutor java-threads

我的应用程序中有以下方法,看起来工作正常......但我不确定它是怎么回事......

ArrayList arr = new ArrayList();
Collection<Future<?>> futures = new LinkedList<Future<?>>();
RestCallThread thread = null;
HttpHeaders header = getAuthHeader(authorization);
for (String ids : IDS) {
    thread = new RestCallThread(ids, header);
    futures.add(executor.submit(thread));
}

for (Future<?> future : futures) {
    try {
        arr.add(future.get());
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}
return arr;

在代码中,RestAPI调用被添加到ThreadPoolExecutor并等待结果..

我的问题是因为该方法基于线程如何在所有API线程完成之前不执行return语句...

任何返回语句的机会都会返回空列表吗?

1 个答案:

答案 0 :(得分:3)

  

我的问题是因为该方法基于线程如何在所有API线程完成之前不执行return语句...

阅读Future#get()上的JavaDoc:

  

如果需要等待计算完成,然后检索其结果。

这意味着循环被阻塞,直到当前迭代的未来得到它的结果,即当循环结束时你知道所有线程都已完成。

  

任何返回语句的机会都会返回空列表吗?

是的,例如如果IDS为空或者所有线程都因异常而失败。