ExecutionService。所有线程完成后如何获得结果?

时间:2011-08-05 17:04:22

标签: java multithreading

我有请求列表,我需要在线程中发送它们并在线程完成时收集所有响应。我怎么知道所有踏板都已完成?

List<Task<Response>> tasks = new ArrayList<Task<Response>>();
for (Request request : requestList) {
        tasks.add(executor.runTask(new RequestCaller(request))); // runTask is my method witch will run threads   
}
for (int i = 0; i < tasks.size; i++) {
   result.add(tasks.get(i).get); // here i want to collect results, but i need to run this loop only when all threads will finish
}

3 个答案:

答案 0 :(得分:2)

一种方法是使用CountDownLatch,将latch对象传递给每个Thread,在完成后让每个线程在其latch对象上调用countDown(),然后通过调用{{1}等待线程锁存器,无论你想要暂停,直到所有线程都完成。

await()

答案 1 :(得分:2)

查看java.util.concurrent包。

一种选择是使用ExecutorCompletionService。该类安排提交的任务在完成后放置在可使用take()访问的队列中。

答案 2 :(得分:1)

签出ExecutorService.invokeAll,它获取一个可调用的列表,并行执行它们,并在它们全部完成时(或者可选地在超时后)返回