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

总结:

核心线程
CPU密集型:核心线程数=CPU核心数(或 核心线程数=CPU核心数+1)
I/O密集型:核心线程数=2*CPU核心数(或 核心线程数=CPU核心数/(1-阻塞系数))
混合型:核心线程数=(线程等待时间/线程CPU时间+1)*CPU核心数

最大线程
IO密集型经验应用,最大线程设置为 2N+1 (N为CPU数量,下同)
CPU密集型应用,最大线程设置为 N+1

想看再往下

当线程池的核心线程数量过大或者过小有没影响?如何合理地设置线程池的核心线程的数量?这个是在日常开发中程序员在使用线程池时经常需要考虑的问题,下面具体介绍下。

1、当线程池的核心线程数量过大或者过小的影响

当线程池中核心线程数量过大时,线程与线程之间会争取CPU资源,这样就会导致上下文切换。过多的上下文切换会增加线程的执行时间,影响了整体执行的效率;

多线程编程中一般线程的个数都大于CPU核心的个数,而一个CPU核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效的执行,CPU采取的策略是为了每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让其他线程使用,这个过程就属于一次上下文切换。

当线程池中的核心线程数量过少时,如果统一时间有大量任务需要处理,可能会导致大量任务在任务队列中排队等待执行,甚至会出现队列满了之后任务无法执行的情况,或者大量任务堆积在任务队列导致内存溢出(OOM)。

2、任务性质

在讨论设置核心线程数之前,先来了解下任务的性质,主要分为CPU密集型(计算密集型)任务、I/O密集型任务、混合型任务:

CPU密集型(计算密集型):系统的I/O读写效率高于CPU效率,大部分的情况是CPU有许多运算需要处理,使用率很高。但I/O执行很快。

I/O密集型:系统的CPU性能比磁盘读写效能要高很多,大多数情况是CPU在等I/O的读写操作,此时CPU的使用率并不高;

混合型任务:既包含CPU密集型又包含I/O密集型。

3、合理设置核心线程数

对于CPU密集型任务,由于CPU密集型任务的性质,导致CPU的使用率很高,如果线程池中的核心线程数量过多,会增加上下文切换的次数,带来额外的开销。因此,一般情况下线程池的核心线程数量等于CPU核心数+1。(注:这里核心线程数不是等于CPU核心数,是因为考虑CPU密集型任务由于某些原因而暂停,此时有额外的线程能确保CPU这个时刻不会浪费。但同时也会增加一个CPU上下文切换,因此核心线程数是等于CPU核心数?还是CPU核心数+1?可以根据实际情况来确定)

对于I/O密集型任务,由于I/O密集型任务CPU使用率并不和很高,可以让CPU在等待I/O操作的时去处理别的任务,充分利用CPU。因此,一般情况下线程的核心线程数等于2*CPU核心数。(注:有些公司会考虑所需要的CPU阻塞系数,即核心线程数=CPU核心数/(1-阻塞系数))

对于混合型任务,由于包含2种类型的任务,故混合型任务的线程数与线程时间有关。一般情况下:线程池的核心线程数=(线程等待时间/线程CPU时间+1)*CPU核心数;在某种特定的情况下还可以将任务分为I/O密集型任务和CPU密集型任务,分别让不同的线程池去处理,但有一个前提–分开后2种任务的执行时间相差不太大。

————————————————
版权声明:本文为CSDN博主「to_real」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/to_real/article/details/116305798

线程池核心数与最大线程数设置相关推荐

  1. 【重难点】【JUC 05】线程池核心设计与实现、线程池使用了什么设计模式、要你设计的话,如何实现一个线程池

    [重难点][JUC 05]线程池核心设计与实现.线程池使用了什么设计模式.要你设计的话,如何实现一个线程池 文章目录 [重难点][JUC 05]线程池核心设计与实现.线程池使用了什么设计模式.要你设计 ...

  2. 0.9.2、线程池——核心线程数、阻塞队列、最大线程数之间的关系

    文章目录 线程池内部运行过程 验证思路 确保先提交的任务优先被线程池处理 确保执行的任务占有足够久的线程池资源 可观测的阻塞队列大小 充分的信息 代码 自定义线程池 结果 结论 基本几结论 新任务提交 ...

  3. 线程池详解和线程池核心数与最大线程数设置

    ThreadPool 为什么要用线程池 1.创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程. 2.控制并发的数量.并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃.(主要原因)可以 ...

  4. java——自己实现基础的线程池及带有任务数过多拒绝策略、线程池销毁、自动扩充线程数量及闲时自动回收线程等操作的改进版线程池

    1. 实现第一版基础的线程池 1.1 首先我们定义一个线程池类ThreadPool,然后线程池有一个容器存放我们创建的线程,另一个容器则是存放当前线程池需要处理的任务队列,线程容器用ArrayList ...

  5. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

  6. Java_Java多线程_Java线程池核心参数 与 手动创建线程池

    参考文章: 1.浅谈线程池ThreadPoolExecutor核心参数 https://www.cnblogs.com/stupid-chan/p/9991307.html 2.Java线程池 Thr ...

  7. 深入浅出吃透多线程、线程池核心原理及代码详解

    一.多线程详解 1.什么是线程 线程是一个操作系统概念.操作系统负责这个线程的创建.挂起.运行.阻塞和终结操作.而操作系统创建线程.切换线程状态.终结线程都要进行CPU调度--这是一个耗费时间和系统资 ...

  8. ThreadPoolExecutor线程池核心参数详解

    理解ThreadPoolExecutor线程池的corePoolSize.maximumPoolSize和poolSize 我们知道,受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,因为 ...

  9. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

最新文章

  1. x264各个版本下载
  2. 数据解析框架之Gson
  3. 奇安信为什么大量招人_券商招人鄙视链:985学历vs美本学历,究竟谁垫底?
  4. oracle安装及使用常见错误
  5. rust房子 如何拆除_“一户多宅”将陆续清查!违规如何处理?
  6. 流水线上的思考——异步程序开发模型(2)
  7. LQR轨迹跟踪算法Python/Matlab算法实现_LQRmatrix推导
  8. ES6——Generator 函数的语法
  9. java基本数据类型_资深大厂Java程序员,由浅入深Java学习资料,高清视频
  10. C++ 输入输出,IO
  11. esp32获取网络时间
  12. iphone配置实用工具iPhone Configuration Utility
  13. html图片逆时针转换,css3怎样做出逆时针旋转倒计时
  14. 租客儿子高考608分,房东送上大礼“免租4年”
  15. 支付微服务设计方案格式模板_开发微商城有哪些常见问题
  16. 【SAP】ABAP——币种金额转换
  17. 天津大学计算机专硕_天津大学计算机技术专硕考研参考书
  18. 字符型数据与数值型数据之间的转换
  19. js中的escape方法有什么用?
  20. P44CustomerDAO及CustomerDAOImpl的实现与测试

热门文章

  1. 2021-08-23 layui给input文本框赋值
  2. 天猫店群是什么?月入十万的天猫店群有前景吗?
  3. postman应用窗口不显示处理方法
  4. 刷题记录(2023.3.14 - 2023.3.18)
  5. es审计日志_elasticsearch 事务日志translog
  6. 调试工具之 101_104_MASTER使用介绍
  7. android 获取系统的壁纸
  8. 关于公司薪酬绩效管理体系的发展
  9. quartus仿真提示: Can't launch the ModelSim-Altera software
  10. 用pythen语言计算复利