Java开发,配置线程池时线程数应该怎么设置

Java开发,配置线程池时线程数应该怎么设置

知了小站
2022-05-20 / 1 评论 / 668 阅读

合理的设置线程数能有效提高 CPU 的利用率,设置线程数又得区分任务是CPU密集型还是 IO密集型

解释

CPU密集型 就是需要大量进行计算任务的线程,如:计算1+2+3+...、计算圆周率、视频解码等,这种任务本身不太需要访问I/O设备,CPU的使用率高;
IO密集型 就是任务运行时大部分的时间都是CPU在等I/O (硬盘/内存) 的读/写操作,如:查询数据库、文件传输、网络请求等,CPU的使用率不高。

根据经验

1、CPU密集型:线程数少一点,推荐:CPU内核数 + 1 
2、IO密集型:线程数多一些,推荐:CPU内核数 * 2
3、混合型:可以将CPU密集和IO密集的操作分成两个线程池去执行即可!

PS:这种方式可能会被面试官找茬

根据计算公式

根据《Java并发编程实战》书中的计算线程数的公式

Ncpu = CPU的数量
Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1
W/C = 等待时间与计算时间的比率
为保持处理器达到期望的使用率,最优的池的大小等于:
Nthreads = Ncpu x Ucpu x (1 + W/C)

实战

假如在一个请求中,计算操作需要10ms,DB操作需要100ms,对于一台2个CPU的服务器,设置多少合适

假设我们需要CPU的使用率达到100%,那么套入公式:`2 x 1 x (1 + 100/10) = 22`

但是实际开发中,可能有各种因素的影响,因此就需要我们在这个结果的基础上进行压力测试,最终得到一个完美的线程数量

最后补个网图,解释了CPU密集型、IO密集型

l3e6yfr1.png

本文共 399 个字数,平均阅读时长 ≈ 1分钟
4

打赏

评论 (1)

取消
  1. 头像
    lure
    Windows 10 · Google Chrome

    很好奇,如果按文章说的,2核,cpu100%
    计算时间10ms,等待时间100ms,
    需要线程:2 x 1 x (1 + 100/10) = 22
    计算时间5ms,等待时间 500ms
    需要线程:2 x 1 x (1 + 500/5) = 200
    计算时间1ms,等待时间 1000ms
    需要线程:2 x 1 x (1 + 1000/1) = 2000

    这样真的合理吗?
    期待博主回复

    回复