首页 > 解决方案 > java multithreading - 等待空闲线程可用性来创建和分配下一个任务

问题描述

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

标签: javamultithreadingthreadpoolthreadpoolexecutor

解决方案


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

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

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

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


推荐阅读