首先线程池有几个核心配置参数:
CORE_SIZE: 核心线程数,当前线程池数量小于核心线程池数量时创建新线程,如果当前有空闲线程则取一个线程运行,除非特殊设置,核心线程不会销毁
BLOCKING_SIZE: 阻塞队列长度, 当核心线程满时,将当前请求放入阻塞队列中,等待核心线程执行完,出队列使用核心线程执行
MAX_POO_SIZE: 最大线程数,阻塞队列满时,仍有多余请求进来,创建新的线程放入池中,并处理当前请求,会保持keep_alive_time后自动销毁
电脑核心数:4
程序运行时间::1000ms
cpu运行时间:100ms
这是我使用一段模拟程序跑的核心线程数从1-300的一个并发请求的总请求时间的一个线图
我们比较熟悉的几个关于核心线程数的配置
1.io密集型cpu_core * 2 = 8
2.复合型cpu_core * (总时间/CPU运行时间)= 4 * (1000ms / 100ms) = 40
首先从图中我们可以看出前面随着核心线程数的增大,执行时间有一个比较明显的缩短,大致呈现一个线性的关系,后面随着核心线程数的增大,执行时间波动增大,且执行时间改善趋势递减,后面几乎没有改善
根据上面的图来思考一下线程池的一个配置
CORE_SIZE: 常驻线程,一个线程需要的栈帧大小默认为1M,因此不适合配置特别大,对于日常请求不是特别大的场景,核心线程数可以设置为cpu_core * 2
BLOCKING_SIZE: 作为一个阈值,作为日常线程和高并发场景下线程的开关
MAX_POO_SIZE:最大线程数,在高并发场景时,应该最大的提升cpu的利用率,因此需要配置更大的线程数cpu_core * (总时间/CPU运行时间)