Java 如何阻止直到线程池为空。。。具有未知数量的线程?
假设我有一个线程池。我给它发了一条线,它就这样快乐地走着。我想阻止主线程,直到池为空/所有线程都已完成,最好不要忙着等待 但是线程可以创建自己的线程并将其添加到池中(数量事先未知)。。。因此,当主线程阻塞时,池可以继续正常地接受和处理线程,这一点很重要。上下文,尽管这无关紧要:我正在执行一个图形搜索 我找到了很多几乎可以解决问题的方法:Java 如何阻止直到线程池为空。。。具有未知数量的线程?,java,multithreading,concurrency,Java,Multithreading,Concurrency,假设我有一个线程池。我给它发了一条线,它就这样快乐地走着。我想阻止主线程,直到池为空/所有线程都已完成,最好不要忙着等待 但是线程可以创建自己的线程并将其添加到池中(数量事先未知)。。。因此,当主线程阻塞时,池可以继续正常地接受和处理线程,这一点很重要。上下文,尽管这无关紧要:我正在执行一个图形搜索 我找到了很多几乎可以解决问题的方法: 执行器可以等待线程完成,但不允许在线程完成时添加新线程 CountDownLatch非常接近,但在创建新线程时不能递增 同样,在这个主题上也有很多线程,但是
- 执行器可以等待线程完成,但不允许在线程完成时添加新线程
- CountDownLatch非常接近,但在创建新线程时不能递增
等待终止
请注意,任务和线程不是一回事。当然,每个任务可以有一个线程,但这将是低效的,特别是当有许多任务时。在内部,池分配给定数量的线程,这些线程将尝试尽快执行挂起的任务
当任务需要生成子任务时,可以使用
——该方法阻塞,直到所有子任务都完成。子任务在“父”任务池中执行李>invokeAll(listOfTasks)
——您可以在不阻塞井的情况下对子任务进行排队李>getPool().execute(aTask)
第一个选项是使用ForkJoinPool的惯用方法。它支持并行分治算法(请参见中的示例)。但是,如果任务生成子任务但不关心其结果,那么第二个选项也应该起作用 这需要是线程吗,或者我们说的是可以包含在可调用的工作单元中的工作单元吗?如果是后者,则应将功与并行功的机制分开。我的程序搜索图形。每当它到达一个具有多个未访问邻居的顶点时,它将创建一个或多个额外线程以继续沿着它们向下。在死胡同或目标处,线程停止。它以一个线程作为起始顶点开始,主线程坐在那里等待搜索完成。这就是线程池或类似构造对我来说有意义的地方。每个新线程都被管理或添加到池中,并且在没有线程运行的情况下完成工作。我可以使用并发容器或信号量轻松完成这项工作,并且可以进行忙碌等待,但是如果主线程只是完全阻塞,直到没有搜索线程运行,对我来说,这似乎是一个更有效的解决方案?@Tom听起来很适合作回答。@Tom回答有点太短了,现在没有时间详细说明。我相信有人会发布更详细的内容(如果没有,请随意发布您自己的答案)。另请参阅:-虽然它说它已经为Java8更新了,我不确定做了哪些更改(我想不会太多)。