核心线程数和最大线程数设置参考标准【Java】
首先确定Java线程是什么态的?
Java的线程是用户态+内核态,而内核态线程通过操作系统来调用,最终的可用线程数与操作系统的核数相关【如果设置了太多,很多是无效线程】
一个设计标准:根据当前业务是IO密集型还是CPU密集型,设置核心线程数
CPU密集型:核心线程数 = CPU核数 + 1【机器学习、视频转码】
IO密集型:核心线程数 = CPU核数 * 2 【Web应用】
Java获取当前机器的逻辑处理器数量:
@Test
public void testThreadPool() {
System.out.println("获取当前机器的逻辑处理器数量");
int cpuNum = Runtime.getRuntime().availableProcessors();
System.out.println("cpuNum = " + cpuNum);
}
结果:
获取当前机器的逻辑处理器数量
cpuNum = 8
Linux获取当前机器物理CPU核数:此处为四个
[root@localhost ~]# more /proc/cpuinfo | grep "model name"
model name : 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
model name : 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
model name : 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
model name : 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
在任务管理器查看:
代码实现:
/**
* 动态获取CPU核心数
*/
public static final int CPU_SIZE = Runtime.getRuntime().availableProcessors();
public Integer corePoolSize = CPU_SIZE;
public Integer maximumPoolSize = (CPU_SIZE*2);
//...略
此处最大线程数设置为核心线程数的两倍