4.线程数设置

线程池线程数设置

关于生产环境如何配置线程数,还是要根据业务来进行区分,我们时常会听到什么IO密集型、CPU密集型任务...
大家知道什么样的任务或者代码会被认定为IO/CPU密集?
又是用什么样的标准来认定IO/CPU密集?
如果你没有明确的答案,那么就随着这篇文章一起来聊一聊吧。
开篇之前我们先来了解下什么是CPU密集型和IO密集型

CPU密集型(CPU-bound)
CPU密集型也叫计算密集型,顾名思义就是应用需要非常多的CPU计算资源,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。

在多核CPU时代,我们要让每一个CPU核心都参与计算,将CPU的性能充分利用起来,这样才算是没有浪费服务器配置,如果在非常好的服务器配置上还运行着单线程程序那将是多么重大的浪费。
代码体现:

int n = 0.0
for (i in 0..9999999) {
    n = Math.cos(i.toDouble()
    )
平常开发应用场景:CPU密集型任务一般来说:计算型代码、Bitmap转换、Gson转换等


IO密集型(I/O bound)

对于IO密集型的应用,就很好理解了,我们现在做的开发大部分都是WEB应用,涉及到大量的网络传输。不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。因此从这里可以发现,对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待的这段时间内,线程可以去做其它事,提高并发处理效率。

代码体现:

BufferedReader br =new BufferedReader(new FileReader("xxxx"), 1024);
try {
    while (br.readLine() != null) {}
} finally {
    if (br != null) {
        br.close()
    }

平常开发应用场景:文件读写、DB读写、网络请求等

日常开发中如何优化:

计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低。所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数

线程数 = CPU核数+1
也可以设置成CPU核数*2,这还是要看JDK的使用版本,以及CPU配置(服务器的CPU有超线程)。对于JDK1.8来说,里面增加了一个并行计算,计算密集型的较理想线程数 = CPU内核线程数*2


IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用

线程数 = CPU核心数/(1-阻塞系数)
这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。套用公式,对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值