【问题标题】:Dynamic Thread Pool Management动态线程池管理
【发布时间】:2012-04-28 14:26:05
【问题描述】:

我在线程池中以最小阈值执行三种类型的任务 A、B、C:

  • (A) 70 %
  • (B) 20 %
  • (C) 10 %

池大小:100 个线程。

如何在任何给定时间确保以下分布:

  1. 没有空闲线程:例如,如果只存在 C 类任务,则池将是 100% C 的
  2. 没有饥饿:B 和 C 任务最终会得到服务

【问题讨论】:

  • 你有多少个内核?除非您有 100 多个内核,否则可能总会有足够的任务让您的内核保持忙碌。对于 CPU 密集型任务,线程数多于内核数可能会更慢。
  • 100这个数字只是为了方便。
  • 如果你让 C 足够大以使用每个核心,其他线程是否空闲并不重要(快速其他线程空闲更好)

标签: java threadpool priority-queue


【解决方案1】:

您应该尝试以下策略:

  • 维护一个PriorityBlockingQueue,所有插入队列的项目都有一个优先级字段,这是比较的基础。让 C 类任务的优先级为 0,B 为 10,A 为 20(较低的值 == 较高的优先级)
  • 在 PriorityBlockingQueue 中维护一个单独的“跟踪”活动 B 项目队列。一个单独的 Timer 实例尝试从 PriorityBlockingQueue 中删除所有 B 项,当成功时,它会降低 B 的优先级并将其重新插入 PriorityBlockingQueue - 这确保 B 类型的项不会饥饿。不成功的尝试意味着该项已经被处理并且该项目应从跟踪队列中删除。
  • 线程池中的线程尝试在处理队列元素之前弹出该元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2012-03-31
    • 2013-11-28
    • 2021-05-10
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多