如何选择线程数量

简介: 本文目录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
线程池最佳线程数量到底要如何配置?
线程池最佳线程数量到底要如何配置?
线程池最佳线程数量到底要如何配置?
|
3天前
|
NoSQL
【线程绑定cpu核心】
【线程绑定cpu核心】
|
3天前
|
存储 前端开发
【源码共读】大并发量如何控制并发数
【源码共读】大并发量如何控制并发数
48 0
|
10月前
|
缓存 监控 算法
案例15-创建大量对象导致cpu飙升
创建大量对象导致cpu飙升
138 0
|
11月前
|
安全 Java
分析ThreadLocal如何做到单个线程独享
分析ThreadLocal如何做到单个线程独享
61 0
|
安全 算法 Java
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
99 0
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
|
Java
面试官:说一下线程池的参数,核心线程非核心线程使用方法,拒绝策略
面试官:说一下线程池的参数,核心线程非核心线程使用方法,拒绝策略
181 0
|
算法 网络协议 程序员
多个线程为了同个资源打起架来了,该如何让他们安分?
避免多线程资源竞争的互斥、同步的方法。
多个线程为了同个资源打起架来了,该如何让他们安分?
|
监控 NoSQL 算法
面试官问:高并发下,你都怎么选择最优的线程数?
面试官问:高并发下,你都怎么选择最优的线程数?
237 0
|
Java Maven
ThreadPoolExectutor使用测试1-线程数量不超过coreSize大小
ThreadPoolExectutor使用测试1-线程数量不超过coreSize大小
216 0