参考来自:http://blog.csdn.net/zhouhl_cn/article/details/7392607
corePoolSize和maxPoolSize等参数比较好理解,但是queueCapacity参数的设置就不是特别好理解。
特别是文中提出的
任务队列的长度要根据核心线程数,以及系统对任务响应时间的要求有关。队列长度可以设置为(corePoolSize/tasktime)*responsetime: (20/0.1)*2=400,即队列长度可设置为400。
下面谈一下我的理解。
corePoolSize/tasktime 的值,本质上是单位时间任务处理量。
如果corePoolSize等于40,tasktime等于0.8秒,那么在核心线程跑满的情况下,系统对于任务的最大处理能力就是40/0.8 也就是50个任务/秒。
为什么是40除以0.8,我一直没绕过来,这样解释一下,如果一个任务的完成时间是0.8秒,那么1秒就能完成 1/0.8 = 1.25个任务。同时有40个线程工作,每秒就是40 * 1.25 = 50个任务每秒。 也就是40 / 0.8 = 50。
然后再乘以responsetime
假设responsetime为2,也就是说队列里存放了当前系统2s内所能处理的最大任务数量。
假设responsetime为3,也就是说队列里存放了当前系统3s内所能处理的最大任务数量。
因此,在不考虑服务器实际承载能力的情况下,maxPoolSize和queueCapacity要结合项目实际可能会遇到的峰值来设计。
我的理解是
如果系统一般情况下任务处理量是40个/秒,遇到高峰时期是平时的3倍,那边就可以把queueCapacity设置为0,maxPoolSize设置为120,这样任务来了就可以快速的新建线程来处理,( ̄▽ ̄)" 。
但实际业务中,不会每秒都是120个任务,所以,把queueCapacity设置到120或者240,那么maxPoolSize就可以降低一些。
So,最终个人的结论就是因个人水平有限,以上参数都是理论值,最后还是得根据实际情况踩坑填坑。