Spring中的ThreadPoolTaskExecutor的参数:corePoolSize、maxPoolSize、queueCapacity分别是什么意思
问题:
今天线上爆出了一个问题,很多的异步线程都跑的非常慢
多线程使用的是Spring的ThreadPoolTaskExecutor
配置如下
1 | corePoolSize: 5 |
错误逻辑
之前以为的逻辑(错误逻辑):
corePoolSize:默认创建线程数量:5个,
maxPoolSize:如果线程数量超过5个后,在maxPoolSize
大小内继续增加线程,直到线程数量到达500个,
queueCapacity:线程数量到达maxPoolSize以后,再添加线程,将会进入queueCapacity进行等待,当等待队列超过queueCapacity设定的值,抛出异常。
可是。。。。现实狠狠的抽了我一巴掌
因为线上发现,线程执行的速度非常慢,很多线程创建了以后并没有执行,而且可以确定线程没有超过500个
百度了一堆,都没有找到这几个参数的正确解释,直到最终看了看源码,发现正确的逻辑是这样的:
正确逻辑
corePoolSize:当线程数小于corePoolSize
个的时候,正常创建线程
queueCapacity:当线程大于corePoolSize
个的时候,将线程放入queueCapacity大小的队列
maxPoolSize:当queueCapacity队列已满
,将会继续创建线程
,直到线程数超过maxPoolSize的大小,将抛出异常
于是线上的问题就找到了,实际上,线程在跑的一直只有5个,所以导致线程一直不执行
解决办法:
也简单,把corePoolSize的大小增大到500即可。