在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换)。
我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程,那么在高并发的情况下,我们怎么选择最优的线程数量呢?
如何配置线程池的核心线程数?
1.先看下机器的CPU核数:Runtime.getRuntime().availableProcessors()
即CPU核数 = Runtime.getRuntime().availableProcessors()
2.然后分析下线程池处理的程序是CPU密集型,还是IO密集型
如果是CPU密集型,则:核心线程数 = CPU核数 + 1
如果是IO密集型,则:核心线程数 = CPU核数 * 2
注:例如 IO密集型(某大厂实践经验):核心线程数 = CPU核数 / (1-阻塞系数)
例如阻塞系数为0.8,CPU核数为4,则核心线程数为:4/(1-0.8)=20