【Java】线程池多大合适?

线程池多大合适?

它是有公式的,看你的项目是什么类型的。

项目一般会把它分成两种类型:CPU密集型、I/O密集型。

假设如果你的项目中计算比较多,但是读取本地文件/读取数据库的操作比较少,那就属于上面的CPU密集型运算,这种情况下我们通常会采用 最大并行数 + 1 就行了,这样就可以实现最优的CPU利用率。

+1 是为了保证当前项目由于ye缺失故障,或者因为一些其他原因导致线程暂停,如果这个线程有问题了,那么额外的线程就可以顶上去。此时就能保证CPU的时候周期不被浪费。简单理解:前面的线程如果出问题了,那么后面的+1就好比是候补的,可以顶上去。

image-20240507153133521

但是如果你的项目读取本地文件操作会比较多,或者读取数据库的操作比较多,这个项目就是 I/O密集型项目,而我们现在大多数项目都是 I/O密集型项目,在这个项目中,CPU并不是总是处于繁忙状态的。

例如当我们进行业务计算的时候,此时就会使用CPU的资源;但是当你进行 I/O操作 的时候/操作数据库的时候,这个时候CPU就闲下来了,此时就可以利用多线程技术将闲下来的时间给利用起来,从而提高了CPU的利用率。

image-20240507153145496

解释公式:以 4核8线程 的电脑为例

  • 最大并行数是8

  • 期望CPU利用率:那我肯定希望它100%被利用,因此这里就写100%

  • 总时间包括CPU计算时间和等待时间。

    例如我现在要从本地文件中读取两个数据,并进行相加,在这个过程里面它至少会有两个操作:1、读取两个数据;2、相加。那么在这两个操作中,读取本地文件中的数据它是跟硬盘有关系的,跟CPU是没有关系的,只有相加才跟CPU是有关系的。假设这两个操作都是耗时1秒钟,那么套用公式,总时间:2s,CPU计算时间:1s,那我就可以这么认为:总时间是100%,CPU的计算时间占50%,这个时候我们就可以将CPU等待的时间拿出来做其他的事情。

因此按照计算公式可以得到,结果是16。因此我就可以规定线程池的总大小就是16。

image-20240507154022007

CPU计算时间和等待时间其实是需要我们利用工具测试的,例如有一款工具叫做 thread dump,它就可以测试。

一旦测试后,就可以套用公式计算结果了。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值