多线程编程 合理线程数

文章转自 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()

 

posted @ 2018-11-20 15:40  姜秋实  阅读(1137)  评论(0编辑  收藏  举报