我有请求列表,我需要在线程中发送它们并在线程完成时收集所有响应。我怎么知道所有踏板都已完成?
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
}
答案 0 :(得分:2)
一种方法是使用CountDownLatch,将latch对象传递给每个Thread,在完成后让每个线程在其latch对象上调用countDown()
,然后通过调用{{1}等待线程锁存器,无论你想要暂停,直到所有线程都完成。
await()
答案 1 :(得分:2)
一种选择是使用ExecutorCompletionService
。该类安排提交的任务在完成后放置在可使用take()
访问的队列中。
答案 2 :(得分:1)
签出ExecutorService.invokeAll,它获取一个可调用的列表,并行执行它们,并在它们全部完成时(或者可选地在超时后)返回