CPU 密集型任务

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

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

耗时 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. 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事

    线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...

  4. cpu核数和逻辑个数的区别_解释一下CPU的核心数与线程数的关系和区别

    我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面文本就来解释一下CPU的核心数与 ...

  5. CPU的核心数、线程数的关系和区别

    我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面笔者就来解释一下CPU的核心数与 ...

  6. CPU核心、进程、线程

    目录 CPU核心和线程数 CPU内核 CPU核心数 CPU与线程数 线程和进程 进程 线程 线程和进程的关系 线程的类型(留坑) Python多线程(留坑) 参考 CPU核心和线程数 CPU个数即CP ...

  7. 线程池大小设置和CPU核心数的关系

    文章目录 1.线程池和CPU核心数的关系 2.常见概念:CPU的核心数,CPU的线程数 3.是否使用线程池就一定比使用单线程高效呢? 1.线程池和CPU核心数的关系 一般说来,大家认为线程池的大小经验 ...

  8. 【转】cpu的核心数与线程数的关系

    原文地址:http://www.dn580.com/dnzs/dncs/2013/10/08/172948914.html 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能 ...

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

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

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

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

最新文章

  1. oracle tns 代理配置_OGG实现Oracle到MySQL数据平滑迁移
  2. html电池百分比,显示电池百分比在哪设置
  3. 算法之组合数学及其算法篇(三) ----- 容斥原理应用以及几个典型的递归关系
  4. 面向对象之反射、包装、(定制)
  5. AliOS Things蓝牙协议栈及应用开发框架介绍
  6. springboot请求处理
  7. java8新特性——如何使用lambda
  8. 北邮数电 爱课堂答案 Verilog专题
  9. 圣思园【深入JVM】笔记-第一课-论学习方法
  10. 史上最详细的MYSQL安装步骤
  11. TreeMap根据value排序遇到的问题及分析
  12. 徒步运动软件怎么申请测试,徒步,不仅是体质健康的锻炼和检测,还是心理健康成长的过程...
  13. python迷宫地图代码_Python机器人探测迷宫代码求助
  14. iNFTnews丨世界首个元宇宙时装周将在Decentraland举办
  15. 2021年中国疫苗行业批签发批次、批签发量及行业发展前景分析:批签发批次增长,签发量下降,未来疫苗需求增加,集中度提高[图]
  16. 解密红杉资本加密局,一个女人选择 ALL IN
  17. Linux_MySQL数据库基础
  18. 类的初始化以及实例化
  19. 推荐5个好用的开源日志分析工具 (转载)
  20. Zynq-Linux移植学习笔记之24-VPVN温度监测

热门文章

  1. 【感动中国】2018年度人物--乡村教师张玉滚//2021-2-16
  2. C语言求随机两个向量乘积,求一个“求向量内积”的C语言程序!
  3. Merger into
  4. 分布式消息队列的避坑指南
  5. 网易推出手机号码邮箱:知道手机号即可发邮件
  6. vue计算属性传参(computed)
  7. Vue - 计算属性
  8. 技术分享 | 遥控器控制(Joystick)
  9. FastAPI 自动文档Swagger UI 打不开。显示空白
  10. 你知道怎么健康安全的佩戴蓝牙耳机吗?双11五款高音质小清新蓝牙耳机推荐