多线程编程 合理线程数
文章转自 https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral(有整理)
《Java Concurrency in Practice》即《java并发编程实践》,如下图:
如上图,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:
Nthreads=Ncpu*Ucpu*(1+w/c),其中
Ncpu=CPU核心数
Ucpu=cpu使用率,0~1
W/C=等待时间与计算时间的比率
二、实际应用
假设cpu100%运转,即撇开CPU使用率这个因素,线程数=Ncpu*(1+w/c)。
线程数=CPU核数*(1+等待时间/CPU执行时间)
IO密集型:一般情况下,如果存在IO,那么肯定w/c>1(等待耗时一般都是计算耗时的很多倍),但是需要考虑系统内存有限(每开启一个线程都需要内存空间),这里需要上服务器测试具体多少个线程数适合(CPU占比、线程数、总耗时、内存消耗)。如果不想去测试,保守点取1即,Nthreads=Ncpu*(1+1)=2Ncpu。这样设置一般都OK。
计算密集型:假设没有等待w=0,则W/C=0. Nthreads=Ncpu。
至此结论就是:
IO密集型=2Ncpu(可以测试后自己控制大小,2Ncpu一般没问题)(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)
计算密集型=Ncpu(常出现于线程中:复杂算法)
java中:CPU核数=Runtime.getRuntime().availableProcessors()