java - java multithreading - 等待空闲线程可用性来创建和分配下一个任务
问题描述
寻找解决多线程问题的方法。我有 N 个任务说 100。我需要使用有限数量的线程运行这 100 个任务,比如 4。任务规模很大,所以我不想一起创建所有任务。只有当池中有空闲线程可用时,才会创建每个任务。任何推荐的解决方案。
解决方案
您可以使用BlockingQueue来定义任务。让一个线程创建任务并使用 将它们添加到队列中put
,这会阻塞直到队列中有空间。然后让每个工作线程从队列中拉出下一个任务。队列的阻塞性质基本上会强制第一个线程(即定义任务)不要领先于工人太远。
这实际上只是生产者-消费者模式的一个例子,其中生产和消费的东西是做一些工作的请求。
完成所有工作后,您需要指定某种方式来完成整个事情。一种方法是在生成线程创建所有任务时将 N 个“毒丸”放入队列中。这些是特殊任务,只是告诉工作线程退出(而不是做一些工作然后要求下一个项目)。由于每个线程最多只能读取一个毒丸(因为它在读取后退出),并且您将 N 个毒丸放入队列中,您将确保您的 N 个线程中的每个线程都能看到一个毒丸。
请注意,如果生成任务的线程消耗资源,例如用于读取任务的数据库连接,则这些资源将被保留,直到所有任务都已生成——这可能需要一段时间!这通常不是一个好主意,所以这种方法在这些情况下不是一个好方法。
推荐阅读
- python - Python:并行或多线程组合来自不同文件的列表
- python-3.x - Facebook Messenger 备份 - 错误文件,charmap 问题
- r - Windows 10 中 RStudio 的环境问题
- css - SASS 未按媒体查询顺序编译
- ios - 如何使 UITableViewCell 笔尖配件工作?
- java - JobIntentService 不会像 IntentService 一样在完成后删除线程
- udp - 重放捕获的 udp 流量
- c# - MySql 数据库的备份密码
- python - 一次在流中搜索多个字符串而不执行“text1”或“text2”或“text3”或
- java - 在 JAVA/ANDROID 中为方法动态添加参数、参数类型和参数值