Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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_Threadpool_Threadpoolexecutor - Fatal编程技术网

java多线程-等待空闲线程可用性以创建和分配下一个任务

java多线程-等待空闲线程可用性以创建和分配下一个任务,java,multithreading,threadpool,threadpoolexecutor,Java,Multithreading,Threadpool,Threadpoolexecutor,正在寻找解决多线程问题的方法。 我有N个任务,比如说100个。我需要使用有限数量的线程(比如4个)运行这100个任务任务规模很大,因此我不想同时创建所有任务。只有当池中有可用的空闲线程时,才会创建每个任务。建议的解决方案 如果可以从线程池中获取某个时间点的活动线程数,则可以解决问题。为此,可以使用ThreadPoolExecutor#getActiveCount。一旦有了活动线程的编号,就可以决定是否创建任务 ThreadPoolExecutor executor = (ThreadPoolEx

正在寻找解决多线程问题的方法。
我有N个任务,比如说100个。我需要使用有限数量的线程(比如4个)运行这100个任务任务规模很大,因此我不想同时创建所有任务。只有当池中有可用的空闲线程时,才会创建每个任务。建议的解决方案

如果可以从线程池中获取某个时间点的活动线程数,则可以解决问题。为此,可以使用
ThreadPoolExecutor#getActiveCount
。一旦有了活动线程的编号,就可以决定是否创建任务

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
executor.getActiveCount();
注意:ExecutorService不提供
getActiveCount
方法,您可以 必须使用
ThreadPoolExecutor
<代码>线程池执行器#getActiveCount 返回活动线程的大致数目 执行任务

您可以使用来定义任务。让一个线程使用创建任务并将其添加到队列中,直到队列中有空间为止。然后让每个工作线程从队列中拉出下一个任务。队列的阻塞性质基本上会强制第一个线程(定义任务)不要超过工作线程太多

这实际上只是一个例子,其中正在生产和消费的东西是一个做一些工作的请求

一旦所有的工作都完成了,你需要指定一种方式来完成整个事情。一种方法是,当生成线程创建了所有任务时,在队列上放置N个“毒药丸”。这些特殊任务只是告诉工作线程退出(而不是做一些工作然后请求下一项)。由于每个线程最多只能读取一个毒丸(因为它在读取后退出),并且您在队列中放置了N个毒丸,因此您将确保您的N个线程中的每一个都能看到一个毒丸


请注意,如果任务生成线程消耗资源,例如用于从中读取任务的数据库连接,那么这些资源将一直保留,直到所有任务都已生成——这可能需要一段时间!这通常不是一个好主意,因此这种方法在这些情况下不是一种好方法。

使用executor服务/线程池。看看这个:,和?@ernest_k:但是我所指的executor服务的所有实现,我都找不到一种方法来等待空闲线程来创建和执行下一个任务。@MTCoster:它将创建一个固定大小的线程池。但是,如果所有线程都在执行某个任务,而我需要等待至少1个空闲线程来创建和执行新任务,该怎么办。@rvp按照MTCoster的建议,使用具有固定线程数的线程池。您只需提交所有任务,但executor服务将在线程可用时调度并运行它们。