'核心池大小的含义'在ScheduledThreadPoolExecutor的构造函数中

时间:2013-04-08 20:28:46

标签: java threadpool threadpoolexecutor

我是ScheduledThreadPoolExecutor的新手(因为我通常使用简单的Timer,但人们一直在建议反对它),我不太明白什么是适当的整数值传递给ScheduledThreadPoolExecutor(int)构造函数。

有人可以解释一下吗?

谢谢

2 个答案:

答案 0 :(得分:6)

如果是ScheduledThreadPoolExecutorcorePoolSize是为执行计划操作而创建的最大线程数。 此线程池是固定大小的,并且空闲线程保持活动状态。

DrunkenRabbit的回答简单无效,因为ScheduledThreadPoolsExecutor文档明确说明(根本没有线程计数峰值):

  

虽然这个类继承自ThreadPoolExecutor,但有一些   继承的调优方法对它没用。特别是,因为   它使用corePoolSize线程和一个固定大小的池   无界队列,对maximumPoolSize的调整没有任何有用的效果。

现在,对于该值,合理的数字将是运行应用程序的CPU核心数。

答案 1 :(得分:0)

基本上,corePoolSize是要在池中维护的线程数。

例如。如果您经常预期10个并发请求,但峰值为20. corePoolSize应为10,最大为20.这样,执行程序将创建最多10个新线程,即使空闲线程可供使用。

JavaDocs

中所述
  

核心和最大池大小

     

ThreadPoolExecutor将根据corePoolSize(请参阅getCorePoolSize())和maximumPoolSize(请参阅getMaximumPoolSize())设置的边界自动调整池大小(请参阅getPoolSize())。当在方法execute(java.lang.Runnable)中提交新任务并且运行的线程少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程。通过设置corePoolSize和maximumPoolSize,可以创建固定大小的线程池。通过将maximumPoolSize设置为基本无限制的值(如Integer.MAX_VALUE),可以允许池容纳任意数量的并发任务。最典型的情况是,核心和最大池大小仅在构造时设置,但也可以使用setCorePoolSize(int)和setMaximumPoolSize(int)动态更改。