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

One*_*ree 13 java threadpool threadpoolexecutor

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

有人能解释一下吗?

谢谢

Ant*_*sss 7

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

DrunkenRabbit的答案简直就是ivalid,因为ScheduledThreadPoolsExecutordocs明确表示(根本没有线程计数峰值):

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

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


dru*_*bit 0

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

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

正如JavaDocs中所述

核心和最大池大小

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

  • 不幸的是,ScheduledThreadPoolExecutor 并不像 ThreadPoolExecutor 一样对待这些参数。STPE 充当大小为“corePoolSize”的固定线程池,并且不会创建任何其他线程。MaximumPoolSize 不执行任何操作。 (20认同)