别再纠结线程池大小/线程数量了,没有固定公式的

本文探讨了线程池大小设置的理论,通过测试发现,一个线程可以跑满一个CPU核心,而过多线程可能导致上下文切换开销。线程数规划的公式虽有指导意义,但在真实程序中难以精确应用。建议根据目标CPU利用率、GC频率等因素,通过测试找到合适的线程数。结论是:没有固定线程数公式,需结合场景和测试确定。
摘要由CSDN通过智能技术生成

作者:空无
来源链接:https://juejin.cn/post/6948034657321484318

可能很多人都看到过一个线程数设置的理论:

  • CPU 密集型的程序 - 核心数 + 1
  • I/O 密集型的程序 - 核心数 * 2

不会吧,不会吧,真的有人按照这个理论规划线程数?

线程数和CPU利用率的小测试

抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解): 一个CPU核心,单位时间内只能执行一个线程的指令 ** 那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。

来写个死循环空跑的例子验证一下:

测试环境:AMD Ryzen 5 3600, 6 - Core, 12 - Threads

public class CPUUtilizationTest {
	public static void main(String[] args) {
		//死循环,什么都不做
		while (true){
		}
	}
}
复制代码

运行这个例子后,来看看现在CPU的利用率: image.png 从图上可以看到,我的3号核心利用率已经被跑满了

那基于上面的理论,我多开几个线程试试呢?

public class CPUUtilizationTest {
	public static void main(String[] args) {

		for (int j = 0; j < 6; j++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					while (true){
					}
				}
			}).start();
		}
	}
}
复制代码

此时再看CPU利用率,1/2/5/7/9/11 几个核心的利用率已经被跑满: image.png 那如果开12个线程呢,是不是会把所有核心的利用率都跑满?答案一定是会的: image.png 如果此时我把上面例子的线程数继续增加到24个线程,会出现什么结果呢? image.png 从上图可以看到,CPU利用率和上一步一样,还是所有核心100%,不过此时负载已经从11.x增加到了22.x(load average解释参考scoutapm.com/blog/unders…),说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值