JAVA 线程数量如何设置

《Java并发编程实战》(http://mng.bz/979c)一书中,Brian Goetz和合著者们为线程池大小
的优化提供了不少中肯的建议。这非常重要,如果线程池中线程的数量过多,最终它们会竞争
稀缺的处理器和内存资源,浪费大量的时间在上下文切换上。反之,如果线程的数目过少,正
如你的应用所面临的情况,处理器的一些核可能就无法充分利用。Brian Goetz建议,线程池大
小与处理器的利用率之比可以使用下面的公式进行估算:
Nthreads = NCPU * UCPU * (1 + W/C)
其中:
❑NCPU是处理器的核的数目,可以通过Runtime.getRuntime().availableProcessors()得到
❑UCPU是期望的CPU利用率(该值应该介于0和1之间)
❑W/C是等待时间与计算时间的比率

比如4核的处理器NCPU是4,你的程序计算一个方法需要5秒钟,整个程序运行也就需要5秒钟,那么W/C比率应该是100

NCPU利用率希望是100%那么也就是1,总体程序最佳的线程数应该是4*1*(1+100)=404个线程数,但实际操作中,设置404个线程明显不能带来性能的优势,这么多线程数只会增加上下文来回切换带来更严重的性能问题。

如果你的程序是计算密集型的并且没有IO操作,那么建议线程数设置为cpu核数+1,减少上下文切换。

如果你的程序是IO密集型的(包括网络连接等待),那么可以按照 Nthreads = NCPU * UCPU * (1 + W/C) 计算线程数.

 

转载于:https://my.oschina.net/u/3905482/blog/1944182

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值