我有一个程序,其中一堆线程执行某些任务。我想知道所有这些线程何时完成,以便我可以利用它们的结果做一些其他事情。我不想使用诸如 Thread.join 之类的东西。我更喜欢的是另一个线程检查所有这些线程,当它看到它们完成时,它会执行一些特殊任务。关于如何做到这一点有什么想法吗?
最佳答案
实际上,阻塞更容易实现,更可靠,并且不会引入任何额外的开销/延迟。如果您不想使用 join()
,请考虑 CountDownLatch
,它允许您等待一组线程。
另一种更令人愉快的方法是 ExecutorService
轻质包裹ExecutorCompletionService
.
这两种方法都可以以非阻塞方式使用,例如只是偷看而不是阻塞并等待结果。但为了不浪费 CPU 周期,有一个单独的后台线程阻塞并等待结果,并在所有工作线程完成后立即发送一些事件。
或者让每个工作线程在完成时发送一个事件。一旦接收到的事件数量达到启动的工作线程数量,接收这些事件的对象就会知道处理已完成。与ListenableFuture
从 Guava 中,您甚至可以避免额外的看门狗线程。
关于Java使用另一个线程检查线程的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13000446/