0

假设我有某种线程池。我向它提交了一个线程,它继续前进。我想阻塞主线程,直到池为空/所有线程都完成,最好不要忙着等待。

但是线程可以创建自己的线程并将其添加到池中(事先未知的数量)......所以重要的是池可以在主线程阻塞时继续正常接受和处理线程。上下文无关紧要:我正在执行图形搜索。

我找到了很多几乎解决方案:

  • Executors 可以等待线程完成,但不允许添加新线程。
  • CountDownLatch 非常接近,但在创建新线程时不能递增。

同样,这个主题也有很多线程,但它们都涉及预先知道正在创建多少线程的程序。实际上,我觉得奇怪的是,这是一个不经常(或根本不)问的问题!

4

1 回答 1

1

正如@Tom 评论的那样,ForkJoinPool似乎足够了:添加到池中的任务可以在池中产生额外的子任务。要在处理完所有任务之前进行阻止,请使用awaitTermination.

请注意,任务和线程不是一回事。您当然可以每个任务有一个线程,但这会效率低下,尤其是在有很多任务的情况下。在内部,池分配给定数量的线程,这些线程将尝试尽快执行待处理的任务。

当任务需要产生子任务时,您可以使用

  • invokeAll( listOfTasks )-- 方法阻塞,直到所有子任务都完成。子任务在“父”任务池中执行。
  • getPool().execute( aTask )-- 您可以在不阻塞井的情况下对子任务进行排队。

第一个选项是使用 ForkJoinPool 的惯用方式。它支持并行分治算法(参见教程中的示例)。但是,如果任务产生子任务但不关心它们的结果,则第二个选项也应该起作用。

于 2013-09-16T09:39:36.283 回答