Spring中的ThreadPoolTaskExecutor的参数:corePoolSize、maxPoolSize、queueCapacity分别是什么意思

问题:

今天线上爆出了一个问题,很多的异步线程都跑的非常慢

多线程使用的是Spring的ThreadPoolTaskExecutor

配置如下

1
2
3
corePoolSize: 5
maxPoolSize: 500
queueCapacity: 100

错误逻辑

之前以为的逻辑(错误逻辑):
corePoolSize:默认创建线程数量:5个,

maxPoolSize:如果线程数量超过5个后,在maxPoolSize大小内继续增加线程,直到线程数量到达500个,

queueCapacity:线程数量到达maxPoolSize以后,再添加线程,将会进入queueCapacity进行等待,当等待队列超过queueCapacity设定的值,抛出异常。

可是。。。。现实狠狠的抽了我一巴掌

因为线上发现,线程执行的速度非常慢,很多线程创建了以后并没有执行,而且可以确定线程没有超过500个

百度了一堆,都没有找到这几个参数的正确解释,直到最终看了看源码,发现正确的逻辑是这样的:

正确逻辑

corePoolSize:当线程数小于corePoolSize个的时候,正常创建线程

queueCapacity:当线程大于corePoolSize个的时候,将线程放入queueCapacity大小的队列

maxPoolSize:当queueCapacity队列已满,将会继续创建线程,直到线程数超过maxPoolSize的大小,将抛出异常

于是线上的问题就找到了,实际上,线程在跑的一直只有5个,所以导致线程一直不执行

解决办法:

也简单,把corePoolSize的大小增大到500即可。