并发下线程池的最佳数量计算

参考文章:https://blog.csdn.net/qq_34417408/article/details/78895573

根据CPU核心数确定线程池并发线程数

1:为什么使用线程池:在高并发的情况下采用线程池,有效的降低了线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) 。

2:两派公式

第一派:《Java Concurrency in Practice》即《java并发编程实践》:


        Nthreads=Ncpu*Ucpu*(1+w/c),其中

        Ncpu=CPU核心数

        Ucpu=cpu使用率,0~1

        W/C=等待时间与计算时间的比率

第二派:《Programming Concurrency on the JVM Mastering》即《Java 虚拟机并发编程》

线程数=Ncpu/(1-阻塞系数):其中计算密集型阻塞系数为0,IO密集型阻塞系数接近1:



结论就是:

两个公式其实在IO密集型,计算密集型可以统一:

IO密集型=2Ncpu(可以测试后自己控制大小,2Ncpu一般没问题)(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)

计算密集型=Ncpu(常出现于线程中:复杂算法)

java中:Ncpu=Runtime.getRuntime().availableProcessors()

你可能感兴趣的:(并发下线程池的最佳数量计算)