设计线程数原则

占用一定数量的cpu执行一定的线程数
线程数过大会导致线程频繁切换
线程数过小会浪费cpu

概念描述

  • cpu执行时间:cpu计算的时间
  • cpu等待事件:IO时间,cpu等待
  • 总时间: 以上两者加和

公式

cpu执行时间/总时间 = cpu数量/总线程数

两种线程池模型

CPU密集型

  • 应用场景:适用于大量数据的计算,减少对磁盘,网络访问的情况下使用(业务场景中性能瓶颈为cpu而非内存,磁盘IO或带宽)
  • 线程数设计:当前机器CPU总数+1

I/O密集型

  • 应用场景:适用于大量数据的交互,性能瓶颈在IO而非cpu上.
  • 线程数设计:当前机器CPU总数*2

最优线程数计算

在《Java并发编程实践》中,是这样来计算线程池的线程数目的:

一个基准负载下,使用 几种不同大小的线程池运行你的应用程序,并观察CPU利用率的水平。
给定下列定义:

概念:

  • Ncpu = 节点cpu数量
  • Ucp = 目标cpu使用率
  • W/C =等待IO时间与计算时间的比率

公式

为保持处理器达到期望的使用率,最优的池的大小等于:

Nthreads = NcpuUcpu(1+W/C)

对于计算密集型应用,假定等待时间趋近于0,是的CPU利用率达到100%,那么线程数就是CPU核心数,那这个+1意义何在呢?

《Java并发编程实践》这么说:

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

对于IO密集型应用,假定所有的操作时间几乎都是IO操作耗时,那么 W/C的值就为1,Ucpu 要达到100%利用率。

根据 Nthreads = Ncpu x Ucpu x (1 + W/C),

那么对应的线程数确实为 2Ncpu 。

如何定义线程数线程数相关推荐

  1. 多线程|pi1.c 使用2个线程根据莱布尼兹级数计算PI

    1.题目要求 使用2个线程根据莱布尼兹级数计算PI 莱布尼兹级数公式: 1 - 1/3 + 1/5 - 1/7 + 1/9 - - = PI/4 主线程创建1个辅助线程 主线程计算级数的前半部分 辅助 ...

  2. java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

    java.线程池 线程数 此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因 ...

  3. 多线程|pi2.c 使用N个线程根据莱布尼兹级数计算PI

    1.题目要求 使用N个线程根据莱布尼兹级数计算PI 与上一题类似,但本题更加通用化,能适应N个核心 主线程创建N个辅助线程 每个辅助线程计算一部分任务,并将结果返回 主线程等待N个辅助线程运行结束,将 ...

  4. 多线程初体验——使用2个线程根据莱布尼兹级数计算PI、多线程排序

    2022.04.24 job7/pi1.c: 使用2个线程根据莱布尼兹级数计算PI 要求 莱布尼兹级数公式: 1 - 1/3 + 1/5 - 1/7 + 1/9 - - = PI/4 主线程创建1个辅 ...

  5. CPU核心数线程数、程序进程线程、并发并行

    核心数(物理概念) 8核:有8个相对独立的CPU核心单元组,这是物理概念,也就是说1个CPU有 8个独立的小CPU,物理上只能同时处理8个任务,也就是物理上是8核8线程. 线程数(逻辑概念) 既然物理 ...

  6. CPU核心数线程数、程序进程线程、并发并行的简单理解

    CPU核心数线程数.程序进程线程.并发并行.简单理解和区分 这篇文章是对上述感念的简单理解,想深入研究可以看看<计算机组成原理> CPU的核心数 线程数 当我们买电脑的时候,会看到CPU的 ...

  7. 线程池核心数与最大线程数设置

    线程池核心数与最大线程数设置 总结: 核心线程 CPU密集型:核心线程数=CPU核心数(或 核心线程数=CPU核心数+1) I/O密集型:核心线程数=2*CPU核心数(或 核心线程数=CPU核心数/( ...

  8. 线程最大线程数什么时候会被创建

    线程最大线程数什么时候会被创建 前言 之前一直错误的以为线程池在执行过程中会先判断核心数然后在判断最大线程数最后才加入队列...完全错误! 已经下已代码展示最大线程数量在什么时候才会被创建 1.首先创 ...

  9. 在代码中定义一个执行线程的步骤

    在代码中定义一个执行线程的步骤 方法(一)   >>继承Thread类   >>重新run()方法   >>调用start()方法         >> ...

  10. android线程及线程池

    众所周知,在UI系统中进行一些耗时操作,都会导致卡顿现象,因为一次刷新在16ms,如果当次操作过了这个时间,那么用户就能感觉到明显的卡顿,甚至引起ANR . 对于这种情况,一般都是再起一个线程,进行一 ...

最新文章

  1. flowable 配置自定义表单_Flowable用代码自定义流程
  2. 0215互联网新闻 | TikTok在美月度用户数量过去三个月内增加3000万;5G智能手机测试机首批正式交付...
  3. WSGI、uwsgi和uWSGI
  4. C++ 中的三种继承public , protected, private
  5. alexnet vgg_从零开始:建立著名的分类网2(AlexNet / VGG)
  6. python制作二级菜单_Python_简单三级菜单制作
  7. 程序员过关斩将--redis做消息队列,香吗?
  8. linux安装pip
  9. 计算机图形学试题a卷,计算机图形学复习题及答案
  10. 分享整理的 Python 学习路线图,(附工具+视频+书籍+面试)
  11. Android短信页面
  12. 4、matplotlib中的子图相关subplot
  13. FFmpeg-2、编解码及视频像素格式尺寸转换和音频重采样
  14. SU插件|TopoShaper生成地形 免费下载及介绍(SketchUp草图大师必备)!
  15. 【资料】舵机控制原理
  16. 单独开一贴个人认为是编译器缺陷希望有人提交给微软
  17. 14期 《心有猛虎 细嗅蔷薇》5月刊
  18. linux测试dvi接口,支持Linux系统的高清DVI采集卡推荐
  19. 图解Linux命令之--hwclock命令
  20. L298N模块的连接与使用(stm32驱动与51驱动)

热门文章

  1. 用EasyHMI做的工程示例一览
  2. Golang开发定时钉钉小机器人(基于gin+gorm)
  3. 条形码生成软件如何批量生成ISBN条码
  4. 人人商城系统安装服务器上,微擎及人人商城安装
  5. 360浏览器登录新浪微博图标显示为字母及占用CPU过高问题的解决
  6. C语言绝对地址函数创建和读取函数
  7. android 打包报错 Execution failed for task ‘:app:lintVitalRelease‘.
  8. 焊接技巧 -- 拖焊
  9. 常见的几个接口管理平台简介
  10. JDBC与MYSQL数据库