Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何阻止直到线程池为空。。。具有未知数量的线程?_Java_Multithreading_Concurrency - Fatal编程技术网

Java 如何阻止直到线程池为空。。。具有未知数量的线程?

Java 如何阻止直到线程池为空。。。具有未知数量的线程?,java,multithreading,concurrency,Java,Multithreading,Concurrency,假设我有一个线程池。我给它发了一条线,它就这样快乐地走着。我想阻止主线程,直到池为空/所有线程都已完成,最好不要忙着等待 但是线程可以创建自己的线程并将其添加到池中(数量事先未知)。。。因此,当主线程阻塞时,池可以继续正常地接受和处理线程,这一点很重要。上下文,尽管这无关紧要:我正在执行一个图形搜索 我找到了很多几乎可以解决问题的方法: 执行器可以等待线程完成,但不允许在线程完成时添加新线程 CountDownLatch非常接近,但在创建新线程时不能递增 同样,在这个主题上也有很多线程,但是

假设我有一个线程池。我给它发了一条线,它就这样快乐地走着。我想阻止主线程,直到池为空/所有线程都已完成,最好不要忙着等待

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

我找到了很多几乎可以解决问题的方法:

  • 执行器可以等待线程完成,但不允许在线程完成时添加新线程
  • CountDownLatch非常接近,但在创建新线程时不能递增
同样,在这个主题上也有很多线程,但是它们都涉及到一些程序,这些程序知道有多少线程是预先创建的。事实上,我觉得奇怪的是,这是一个没有被问得更频繁(或根本没有)的问题

正如@Tom所评论的,似乎已经足够了:添加到池中的任务可以在池中产生额外的子任务。要阻止,直到所有任务都已处理完毕,请使用
等待终止

请注意,任务和线程不是一回事。当然,每个任务可以有一个线程,但这将是低效的,特别是当有许多任务时。在内部,池分配给定数量的线程,这些线程将尝试尽快执行挂起的任务

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

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

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

这需要是线程吗,或者我们说的是可以包含在可调用的工作单元中的工作单元吗?如果是后者,则应将功与并行功的机制分开。我的程序搜索图形。每当它到达一个具有多个未访问邻居的顶点时,它将创建一个或多个额外线程以继续沿着它们向下。在死胡同或目标处,线程停止。它以一个线程作为起始顶点开始,主线程坐在那里等待搜索完成。这就是线程池或类似构造对我来说有意义的地方。每个新线程都被管理或添加到池中,并且在没有线程运行的情况下完成工作。我可以使用并发容器或信号量轻松完成这项工作,并且可以进行忙碌等待,但是如果主线程只是完全阻塞,直到没有搜索线程运行,对我来说,这似乎是一个更有效的解决方案?@Tom听起来很适合作回答。@Tom回答有点太短了,现在没有时间详细说明。我相信有人会发布更详细的内容(如果没有,请随意发布您自己的答案)。另请参阅:-虽然它说它已经为Java8更新了,我不确定做了哪些更改(我想不会太多)。