线程池中线程数改如何设置

面试题

  • java中线程池用过吧(听到这里内心窃喜,以为又要老生常谈让我说下主要参数),结果面试官画风一转,说下线程数通常是怎么设置的?有什么规则?(嗯哼,面试还没开始就触碰到了我的知识盲点吗?无数乌鸦飘过)

    硬着头皮回答,经验值一般是cpu核数*2
    
  • 面试官灵魂拷问为什么是cpu 数*2呢?

     。。。老实交代,不知道。。
    

经验值

  • 如果是CPU密集型应用,则线程池大小设置为N+1
  • 如果是IO密集型应用,则线程池大小设置为2N+1

知识点–敲黑板

CPU密集型 (CPU-bound)

CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
CPU bound的程序一般而言CPU占用率相当高。这可能是因为任务本身不太需要访问I/O设备,也可能是因为程序是多线程实现因此屏蔽掉了等待I/O的时间。

IO密集型(I/O bound)

IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。
I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O操作,而pipeline做得不是很好,没有充分利用处理器能力

CPU密集型 vs IO密集型

CPU密集型任务特点是要进行大量的计算,这种场景下,任务越多花在任务切换的时间就越多,CPU执行任务的效率就越低。
IO密集型任务,特点是CPU消耗很少,任务大部分时间在等待IO操作完成(比如网络访问第三方系统、查询库等)。对于IO密集型任务,任务越多CPU效率越高,当然都有一个限度。

理论支撑- 利特尔法则
  一个系统请求数=请求的到达率*平均某个单独请求花费的时间

通过这个公式我们可以了解到三个具体参数值:

  1. 一个请求所消耗的时间
  2. 该请求的计算时间
  3. CPU数目
合理线程数计算公式
最佳线程数目 =((线程等待时间+线程CPU时间)/线程CPU时间)* CPU数目

通过这个公式可以得出一个结论:

 线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

这个结论与前文提到的经验值基本吻合。

结论

文中提到了线程数设置经验值以及理论支撑,在实际应用中,还需要结合实际消耗,压测,来对线程数进行微调。

更多精彩内容请关注公众号

更多精彩内容请关注公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值