合适的线程数量是多少?CPU 核心数和线程数的关系?

CPU 密集型任务
首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去利用 CPU 资源来执行自己的任务,这就会造成不必要的上下文切换,此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降。

针对这种情况,我们最好还要同时考虑在同一台机器上还有哪些其他会占用过多 CPU 资源的程序在运行,然后对资源使用做整体的平衡。

耗时 IO 型任务
第二种任务是耗时 IO 型,比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。对于这种任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。

《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法:

线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)

通过这个公式,我们可以计算出一个合理的线程数量,如果任务的平均等待时间长,线程数就随之增加,而如果平均工作时间长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少。

太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源。

结论:

  • 线程的平均工作时间所占比例越高,就需要越少的线程;

  • 线程的平均等待时间所占比例越高,就需要越多的线程;

  • 针对不同的程序,进行对应的实际测试就可以得到最合适的选择。

面试题:合适的线程数量是多少?CPU 核心数和线程数的关系?相关推荐

  1. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  2. Android性能优化系列:CPU收敛优化(线程优化)

    文章目录 线程调度 线程调度的原理 线程调度模型 Android 的线程调度 线程调度小结 Android 异步方式汇总 Thread HandlerThread IntentService Asyn ...

  3. 合理估算线程池线程数量

    参考<Java并发编程实战> 线程数量计算公式 公式:Nthread = Ncpu * Ucpu * (1+ W/C),各字段含义: Nthreads:线程数量 Ncpu:CPU的数量,R ...

  4. c++线程数量的限制

    C++线程数量的限制 限制 修改限制 限制 线程的数量取决于线程栈空间的大小(可以使用ulimit -s查看栈空间大小) 132位Linux下(可以使用getconf LONG_BIT查看当前CPU运 ...

  5. JUC-如何选择线程数量

    本文目录 CPU密集型 IO密集型 选择线程数量 区别 总结 CPU密集型 CPU密集型 又叫做计算密集型,系统运作大部分是CPU Loading,CPU密集就是该任务需要大量的运算,而没有阻塞,CP ...

  6. 根据CPU核数合理设置线程池大小

    一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可. 我们所需要关心的主要是核心池线程的数量该如何设置. 自定义线程池代码 package com. ...

  7. Java线程池面试必备:核心参数、工作流、监控、调优手段

    欢迎关注方志朋的博客,回复"666"获面试宝典 1. Java的线程池 ① 合理使用线程池的好处 Java的线程池是运用场景最多的并发框架,几乎所有需要异步或者并发执行任务的程序都 ...

  8. 用java线程绘制图案_关于多线程:使用线程在java中绘制面板

    我正在编写一个包含许多不同视图的程序. 其中一个是相当图形密集型(它显示一个互连的图形). 其他人只是展示小而复杂的图表. 我发现主视图的绘制时间很长(甚至只绘制当前可见的区域),并且在绘制时,界面的 ...

  9. java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...

  10. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

最新文章

  1. R语言PCA主成分分析(Principle Component Analysis)实战2
  2. request.getParameterMap()的坑
  3. 在Spark上用Scala实验梯度下降算法
  4. 曲线抽稀 java_Python实现曲线点抽稀算法
  5. 【PHP ThinkPHP框架】小bug汇总[更新]
  6. .NET Core 3.1之深入源码理解HealthCheck(二)
  7. python无所不能_python-列表
  8. 查找二叉树(信息学奥赛一本通-T1367)
  9. 有“嗅觉”的电脑:英特尔神经拟态芯片能嗅出危险化学品气味
  10. .net中多控件共享事件处理程序的方法
  11. HDU 4380 Farmer Greedy 计算几何+bitset
  12. pg_stat wait timeout
  13. 李国庆与当当,一个中国网络书店的传奇
  14. 【05月22日】预分红股息率最高排名
  15. ps彩色照片变黑白照片
  16. 【web开发 模拟ua调试】修改chrome浏览器的user agent
  17. HUD - 1873
  18. 自制黑科技------桌面整理工具
  19. eclipse Android添加权限
  20. Day644.Spring框架开发双刃剑 -Java业务开发常见错误

热门文章

  1. 基于ARCGIS更改已经标定的线性单位(自用记录)
  2. 专业数据分析软件 OriginLab Origin 8
  3. k30pro杀进程严重怎么解决_王者荣耀卡顿严重怎么解决?有没有免费的手游加速工具?...
  4. 主力骗线出货! 71种K线形态详细分析
  5. 国家信息安全等级考试NISP一级题库(1)第101至200题
  6. c语言99乘法表设计,C++设计编一个程序输出一个九九乘法表?
  7. 基于ERNIE的汽车之家评论多标签分类
  8. MCU电机控制/预驱/芯片,来
  9. 为什么要学习思维导图?思维导图的作用
  10. 牛客网--C 照看小猫