0

我有一个程序,其中一堆线程执行某些任务。我想知道所有这些线程什么时候完成,以便我可以用它们的结果做一些其他的事情。我不想使用像Thread.join. 我更喜欢的是另一个线程检查所有这些线程,当它看到它们完成时,它会执行一些特殊任务。关于如何做到这一点的任何想法?

4

2 回答 2

4

我会使用 ExecutorService 之类的

List<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();
于 2012-10-21T17:49:46.927 回答
4

实际上阻​​塞更容易实现,更可靠并且不会引入任何额外的开销/延迟。如果您不想使用join(),请考虑CountDownLatch,它允许您等待一组线程。

另一种更令人愉快的方法是ExecutorService使用轻量级ExecutorCompletionService.

这两种方法都可以以非阻塞方式使用,例如只偷看而不是阻塞并等待结果。但是为了不浪费 CPU 周期,有一个单独的后台线程阻塞并等待结果,并在所有工作线程完成后立即发送一些事件。

或者让每个工作线程在完成后发送一个事件。一旦接收到的事件数量达到启动的工人数量,接收这些事件的对象将知道处理已完成。使用ListenableFuturefrom Guava,您甚至可以避免额外的看门狗线程。

于 2012-10-21T17:51:33.187 回答