前言

本章主要讨论线程池合适的线程数量是多少,以及 CPU 核心数和线程数的关系。我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。

1. CPU密集型


第一种是 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。

最佳线程数 = CPU 核心数的 1~2 倍

如果设置过多的线程,实际上并不会起到很好的效果。此时假设我们设置的线程数是 CPU 核心数的 2 倍以上,因为计算机的任务很重,会占用大量的 CPU 资源,所以这是 CPU 每个核心都是满负荷工作,而设置过多的线程数,每个线程都去抢占 CPU 资源,就会产生不必要的上下文切换,反而会造成整体性能的下降。

2. IO密集型


第二种任务是耗时 IO 型,比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。

对于这种情况任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。

3. 通用公式


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

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

4. 结论


综上所述我们就可以得出以下结论:

线程的 CPU 耗时所占比例越高,就需要越少的线程
线程的 IO 耗时所占比例越高,就需要越多的线程
针对不同的程序,进行对应的实际测试就可以得到最合适的选择
线程数 >= CPU 核心数

线程池应该设置多少核心线程数——Java多线程系列学习笔记相关推荐

  1. Java多线程(五):线程池应该设置多少核心线程数

    创建线程池有个CorePoolSize参数,指的是核心线程数,该参数应该设置为多大呢? CPU密集型 一般公式:CPU核数 + 1 通过以下代码动态获取CPU核数: Runtime.getRuntim ...

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

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

  3. Java线程池如何合理配置核心线程数

    我相信大家都用过线程池,但是线程池数量设置为多少比较合理呢? 线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去探索吧! 首先要考虑 ...

  4. 面试官:如何评估一个线程池需要设置多少个线程

    作者 | 丁威       责编 | 欧阳姝黎 见字如面,我是威哥,一个从普通二本院校毕业,从未曾接触分布式.微服务.高并发到通过技术分享实现职场蜕变,成长为 RocketMQ 社区优秀布道师.大厂资 ...

  5. 【并发编程】线程池参数设置与动态调整

    看了美团的一篇技术文章后才知道原来线程池的参数还可以动态调节. 一.场景分析 1.1 一个线程池中的线程异常了,那么线程池会怎么处理这个线程? public class ThreadPoolExecu ...

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

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

  7. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

  8. 一篇就够,线程与线程池的那些事之线程池篇

    本文关键字: 线程 , 线程池 , 单线程 , 多线程 , 线程池的好处 , 线程回收 , 创建方式, 核心参数 , 底层机制 , 拒绝策略 , 参数设置 , 动态监控 , 线程隔离 线程和线程池相关 ...

  9. java线程池的面试题_java线程池 面试题(精简)

    什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理. 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线 ...

最新文章

  1. Dojo 之 面向对象
  2. 列字段通用excel导入修改版
  3. html写个用户协议,五分钟学会HTML5的WebSocket协议
  4. 《隐秘的角落》数学学霸朱朝阳如何炼成?这3招,你家孩子也能用上!
  5. Java——类的继承
  6. python的numpy教程_python numpy 基础教程 | 学步园
  7. 多个非空文件整合至一个文件
  8. 第17讲 | 去中心化与区块链交易性能
  9. CodeForces 489B (贪心 或 最大匹配) BerSU Ball
  10. ENVI去除NDVI/EVI异常值、NAN(not a number,无效值)、无穷大(inf)
  11. ENVI学习总结(一)——自定义坐标系
  12. webservice视频教程-基于SOA 思想下的WebService实战
  13. 进度计划中的时间相关术语
  14. 普元的ajax,普元EOS平台介绍
  15. Pandas处理和转置excel数据
  16. 拍拍熊(APT-C-37),诱导方式、DNS、安卓远控
  17. 大淘客cms源码修改二次开发
  18. 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧
  19. java 计算百分数问题
  20. transition transform属性造成文字抖动及模糊的解决方法

热门文章

  1. SOX 音频处理工具基本使用
  2. MyBatis(六)SqlSessionTemplate是如何保证线程安全的
  3. TeamCity和GitLab整合
  4. 面试官:InnoDB中一棵B+树可以存放多少行数据?
  5. 优化 Golang 分布式行情推送的性能瓶颈
  6. Linux线程(七)
  7. 揭秘北京2022冬奥会背后的技术
  8. 灵光一现的创造——霍夫曼编码
  9. 【线上分享】互动协作白板与音视频实时同步技术实践
  10. NETINT刘迅思:底层软件开发向上层应用靠拢