如何选择线程数量

简介: 本文目录CPU密集型IO密集型选择线程数量区别总结

CPU密集型


CPU密集型 又叫做计算密集型,系统运作大部分是CPU Loading,CPU密集就是该任务需要大量的运算,而没有阻塞,CPU一直全速运行


IO密集型


IO密集型指的是在系统运行过程中,大部分的状况是CPU在等I/O的读/写操作,此时CPU Loading并不高。因为认为本身需要大量I/O操作


选择线程数量

公式:最佳线程数目=(线程等待时间与线程CPU时间之比+1)CPU数目
对于 CPU密集型 ,线程等待时间/线程CPU时间 接近于0,所以设置线程数为CPU的数目
线程数目不易太大,如果线程数太大就会造成线程切换,降低效率

在实际情况中一般CPU密集型线程数量设置为CPU数+1*

在《Java并发编程实践》中 计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。

所以设置为CPU数+1是一个经验值对于I/O密集型 ,线程CPU 使用率较低,程序中会存在大量的 I/O 操作占用时间,导致线程空余时间很多。线程等待时间/线程CPU时间 大等于1,设置线程数为CPU数*2,后续根据实际情况进行动态的调整


区别


IO密集型:大量网络,文件操作

CPU 密集型:大量计算,cpu 占用越接近 100%, 耗费多个核或多台机器


总结


即使有上面的简单估算方法,也许看似合理,但实际上也未必合理,都需要结合系统真实情况(比如是IO密集型或者是CPU密集型或者是纯内存操作)和硬件环境(CPU、内存、硬盘读写速度、网络状况等)来不断尝试达到一个符合实际的合理估算值。

相关文章
|
存储 算法 Java
线程池最佳线程数量到底要如何配置?
线程池最佳线程数量到底要如何配置?
线程池最佳线程数量到底要如何配置?
|
8月前
|
缓存 Go
控制goroutine 的并发执行数量
控制goroutine 的并发执行数量
87 0
|
5月前
|
存储 前端开发
【源码共读】大并发量如何控制并发数
【源码共读】大并发量如何控制并发数
44 0
|
10月前
|
缓存 监控 算法
案例15-创建大量对象导致cpu飙升
创建大量对象导致cpu飙升
138 0
|
安全 算法 Java
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
99 0
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
|
监控 NoSQL 算法
面试官问:高并发下,你都怎么选择最优的线程数?
面试官问:高并发下,你都怎么选择最优的线程数?
237 0
|
Java Maven
ThreadPoolExectutor使用测试1-线程数量不超过coreSize大小
ThreadPoolExectutor使用测试1-线程数量不超过coreSize大小
215 0
|
Java 测试技术 Maven
ThreadPoolExecutor使用测试2-线程数量达到maximumSize
ThreadPoolExecutor使用测试2-线程数量达到maximumSize
136 0
|
测试技术
【高并发】高并发场景下创建多少线程才合适?一条公式帮你搞定!!
创建多少线程合适, 要看多线程具体的应用场景。一般来说,我们可以将程序分为:CPU密集型程序和I/O密集型程序, 而针对于CPU密集型程序和I/O密集型程序,其计算最佳线程数的方法是不同的 。
231 0
|
缓存 Java
高并发之——创建线程池居然有这么多方式...
在Java的高并发领域,线程池一直是一个绕不开的话题。有些童鞋一直在使用线程池,但是,对于如何创建线程池仅仅停留在使用Executors工具类的方式,那么,创建线程池究竟存在哪几种方式呢?就让我们一起从创建线程池的源码来深入分析究竟有哪些方式可以创建线程池。
148 0