线程池七大核心参数

核心线程数:5 ,最大线程数:2 0,线程存活时间:1 2 0秒,任务队列:LinkedBlockingQueue,线程优先级:NORM_PRIORITY,拒绝策略:CallerRunsPolicy,线程工厂:自定义。
这就是坑,别信默认配置,别这么干。

线程池七大参数

说白了,线程池的七大参数就像调酒师配酒,每个参数都决定最后味道。
核心线程数corePoolSize是基础,去年我们跑的那个项目里,设置8 个核心线程,CPU 5 0%负载时响应最稳;最大线程数maximumPoolSize是上限,我们试过3 0个时,并发量突然从2 000量级掉到1 5 00,用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。

另外一点,keepAliveTime和unit组合是个玄学,3 000量级任务时,1 00毫秒的存活时间比2 00毫秒能多跑1 5 %请求,但超过5 00毫秒就浪费资源了。
我一开始也以为随便设个值就行,后来发现不对,这个点很多人没注意。
还有个细节挺关键的,比如用LinkedBlockingQueue时,线程数设多了队列会无限长,但用ArrayBlockingQueue时,队列长度固定,这时候handler策略就特别重要,CallerRunsPolicy虽然把压力转回主线程,但确实救过急。

等等,还有个事,threadFactory别忽略,去年有个项目因没设置线程名,1 00个线程堆里找问题花了2 天。
说实话挺坑的。
建议先从核心线程和队列开始调,别一上来就整最大线程数。

线程池七大核心参数

说白了,线程池就靠这七件事把任务给安排得明明白白。
核心线程数和最大线程数决定了线程的伸缩范围,前者是基本盘,后者是上限;任务队列是任务的蓄水池,队列满了再加人;线程存活时间管着非核心线程的寿命,超时就干掉;拒绝策略是任务队列爆了咋办,直接怼人、删任务还是扔最老的;线程优先级管着谁先干,紧急的先来;线程工厂是造人的车间,可以给线程加特殊配置。

展开讲,核心线程数和最大线程数的关系去年我们跑的那个高并发项目里特别明显,核心设5 个,最大设3 0,高峰期任务秒杀;任务队列分好几种,去年项目用的是直接队列,结果任务积压炸了,后来改了优先级队列才稳住。
线程存活时间是个坎儿,我们去年差点踩坑,设了6 0秒,结果一个长任务卡住把非核心线程全养死了,后来改成3 0秒才好。
拒绝策略别硬扛,我们去年用的是丢弃最老的,说实话挺坑的,把老客户订单给丢了,最后改了拒绝异常,至少有日志查。

我一开始也以为线程工厂没啥用,后来发现不对,可以给线程加个标记,出问题的时候能快速定位。
等等,还有个事,优先级这东西别瞎用,去年项目里优先级高的线程抢资源太猛,把低优先级的搞抑郁了。

建议多跑跑压测,看看队列和线程数的最佳配比。