先弄清楚几个关键角色:
corePoolSize:运行线程池大小
maximumPoolSize:最大线程池大小
关系主体:任务(task)、队列(queue)、线程(thread)
专用语:无界(没有容量限制的)
排队机制:
·当运行时线程小于corePoolSize时,为新进入的任务创建线程。
·当存在>=corePoolSize的线程运行时,新进入任务进入队列;
·当队列大小达到queue size的时候,为新进入的任务创建线程,直到线程数量也达到了最
大值maximumPoolSizes.
·当队列和线程都达到最大值的时候,拒绝新进入的任务。
通过设置corePoolSize、maximumPoolSizes、queue size的大小或设置为有界、无界,实现以下排队策略:
1. 直接传送(Direct handoffs)
前提条件:无界队列(SynchronousQueue
);无界线程池(unbounded maximumPoolSizes)
机制:为新来的任务马上创立新的线程,队列不保存任何一个新进入的任务。对于任何新到来的任务没有拒绝机制。
2. 无绑定队列(Unbounded queues)
前提条件:无界队列(for example a LinkedBlockingQueue
without a predefined capacity);有界线程池(bounded corePoolSize)
机制:1.当运行时线程小于corePoolSize时,为新进入的任务创建线程;
2. 当存在=corePoolSize的线程运行时,新进入的任务全部进入队列。队列的大小没有限制,因此运行中的线程包括(idle状态线程)数量不会超过corePoolSize。此时,maximumPoolSizes没有任何作用。
3. 绑定队列(Bounded queues)
前提条件:有界队列(for example, an ArrayBlockingQueue
);有界线程池(bounded corePoolSize)
机制:与排队机制一致。通过调节Queue sizes 和 maximum pool sizes,可以使得策略倾向于少CPU等资源消耗低任务吞吐量,还是高CPU消耗高任务吞吐量。
综上,不同的策略有不同的结果影响。
大Queue sizes小maximum pool sizes可导致低资源消耗,低吞吐量,可能低于操作系统本有的吞吐能力,造成资源的浪费。
小Queue sizes大maximum pool sizes可能导致CPU过忙,可能导致系统崩溃,也会影响吞吐量。