动态线程池管理

4
我有三种任务A、B、C需要在线程池中执行,并且要求达到最小阈值:
- (A) 70% - (B) 20% - (C) 10%
线程池大小为100个线程。如何确保在任何给定时间内都能实现以下分配:
1.没有空闲线程:例如,如果只存在类型C的任务,则线程池将是100% C。 2.没有饥饿现象:B和C任务最终将得到服务。

你有多少个核心?除非你有100个以上的核心,否则很可能总会有足够的任务来保持你的核心繁忙。对于CPU密集型任务,拥有比核心更多的线程可能会更慢。 - Peter Lawrey
100 这个数字只是为了方便而已。 - oren ef
如果你使C足够大以利用每个核心,那么其他线程闲置就无关紧要了(事实上,其他线程闲置更好)。 - Peter Lawrey
1个回答

1
您应该尝试以下策略:
  • 使用PriorityBlockingQueue维护队列,所有插入队列的项目都有一个优先级字段作为比较基准。让类型C的任务具有优先级0,B具有10,A具有20(较低的值==较高的优先级)
  • 维护一个单独的“跟踪”队列,其中包含PriorityBlockingQueue中所有活动的B项。单独的Timer实例尝试从PriorityBlockingQueue中删除所有B项,成功后会将B项的优先级减少并重新插入PriorityBlockingQueue - 这确保了B类型项目不会饿死。失败的尝试意味着该项已经被处理过,应将该项从跟踪队列中删除。
  • 线程池中的线程在处理之前尝试弹出队列中的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接