我有一个程序,其中一堆线程执行一些任务。我想知道所有这些线程何时完成,以便我可以用他们的结果做其他一些事情。我不想使用像Thread.join
这样的东西。我更喜欢的是另一个线程检查所有这些线程,当它看到它们完成时,它执行一些特殊任务。关于如何做到这一点的任何想法?
答案 0 :(得分:4)
我会使用像
这样的ExecutorServiceList<Future> futures = new ArrayList<Future>();
for(int i = 0; i < N_TASKS; i++)
futures.add(executorService.submit(new Task(i));
// wait for all tasks to complete.
for(Future future : futures) future.get();
答案 1 :(得分:4)
实际上,阻塞更容易实现,更可靠,并且不会引入任何额外的开销/延迟。如果您不想使用join()
,请考虑CountDownLatch
,它允许您等待一组线程。
另一个更令人愉快的方法是ExecutorService
包裹着轻量级ExecutorCompletionService
。
两种方法都可以以非阻塞的方式使用,例如,只是偷看而不是阻止和等待结果。但是为了不浪费CPU周期,有一个单独的后台线程阻塞并等待结果并在所有工作线程完成后立即发送一些事件。
或者让每个工作线程在完成后发送一个事件。接收到这些事件的对象将知道一旦接收到的事件的数量达到启动的工作人员数量就完成处理。使用来自Guava的ListenableFuture
,您甚至可以避免使用额外的监视程序线程。