繁体   English   中英

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

[英]java multithreading -Wait for free threads availability to create and assign next task

寻找解决多线程问题的方法。 我有 N 个任务,比如 100。我需要使用有限数量的线程来运行这 100 个任务,比如 4。任务大小很大,所以我不想一起创建所有任务。 只有当池中有空闲线程可用时,才会创建每个任务。 任何推荐的解决方案。

您可以使用BlockingQueue来定义任务。 让一个线程创建任务并使用put将它们添加到队列中,它会阻塞直到队列中有空间。 然后让每个工作线程从队列中取出下一个任务。 队列的阻塞性质基本上会强制第一个线程(即定义任务)不要领先于工作线程太远。

这实际上只是生产者-消费者模式的一个例子,其中被生产和消费的东西是做一些工作的请求。

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

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

如果可以从线程池中获取某个时间点的活动线程数,则可以解决您的问题。 为此,您可以使用ThreadPoolExecutor#getActiveCount 获得活动线程的数量后,您就可以决定是否应该创建任务。

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
executor.getActiveCount();

注意:ExecutorService 不提供getActiveCount方法,你必须使用ThreadPoolExecutor ThreadPoolExecutor#getActiveCount返回正在积极执行任务的线程的approximate数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM