Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2020-10-26:线程池的线程数怎么设置比较好?

2020-10-26:线程池的线程数怎么设置比较好?

原创
作者头像
福大大架构师每日一题
修改于 2020-10-27 02:28:14
修改于 2020-10-27 02:28:14
1.6K0
举报

福哥答案2020-10-26:

简单回答:

CPU密集型:【cpu核心数】【cpu核心数+1】【cpu核心数-1】。

IO密集型:【cpu核心数*2】。

混合型:【cpu核心数 / (1 - 阻塞系数)】,阻塞系数=阻塞时间/(阻塞时间+计算时间)。

求并发:【并发数=线程数/单个任务时间】。

中级回答:

首先,考虑线程池究竟需要几个呢?不同业务是否需要不同线程池来避免某个业务阻塞时,其他业务也无法运行。最好是业务分类,不同的线程池去执行。

N-1原因:然后,每个线程池的线程数量,要考虑业务上下游,cpu,io资源使用的情况,来设计。很多线程池设计为cpu核数-1,例如Java 8之后jvm启动时默认会启动的coomonForkJoinPool,这个线程池执行forkjointask,高峰时很容易吃满cpu,属于计算密集型,这个情况下,最好设置为cpu核数-1,避免出问题时吃满cpu,导致其他业务完全无法运行,并且无法恢复以及定位问题。还有很多线程池设置为cpu核数*2,这是考虑IO是阻塞有延迟的,属于IO密集型,这样在IO阻塞,并且请求到达之间有延迟,每个线程都能充分运用。还要考虑业务上下游,例如上游业务线程池个数,下游业务线程池个数,还有就是本身能使用的IO资源,例如数据库连接个数等等。

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

《Java并发编程实践》中的方法:

Ncpu = CPU的数量。

Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1。

W/C = 等待时间与计算时间的比率。

Nthreads = Ncpu x Ucpu x (1 + W/C)。

《Java虚拟机并发编程》中的方法:

线程数 = CPU可用核心数/(1 - 阻塞系数),其中阻塞系数的取值在0和1之间。阻塞系数=阻塞时间/(阻塞时间+计算时间)。

求并发数:

并发数=线程数/单个任务时间。


【原创】腾讯面试官:线程池要设置多大

2020-10-26:线程池的线程数怎么设置比较好?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【原创】腾讯面试官:线程池要设置多大
有个朋友Hunter跟我聊,最近他参加腾讯的面试,在二面的时候被问到了关于线程池线程数目设置的一个问题。此处记录下这个问题的面试过程,以及后面关于此问题的理论方面的知识讲解。
王金龙
2020/03/26
6.5K6
面试官问:高并发下,你都怎么选择最优的线程数?
为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) 。
芋道源码
2020/06/16
1.1K0
别再纠结线程池大小/线程数量了,没有固定公式的
抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程的指令 那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。
Java旅途
2021/05/07
1.2K0
问一下,线程池里面到底该设置多少个线程?
来源 | cnblogs.com/dennyzhangdd/p/6909771.html
程序猿DD
2020/07/17
8020
问一下,线程池里面到底该设置多少个线程?
JUC 多线程 线程池
线程池主要是控制运行线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。
万能青年
2019/08/30
6520
JUC 多线程 线程池
线程数,射多少更舒适?
线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去探索吧!
武培轩
2020/03/25
1.1K0
线程数,射多少更舒适?
线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数
我们线程池使用ThreadPoolExecutor的方式进行创建,下面看底层源码:
Java廖志伟
2022/09/28
6220
线程池:第三章:线程池的手写改造和拒绝策略以及线程池配置合理线程数
如何合理设置线程池大小
对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了。
AlbertZhang
2020/10/14
1.8K0
(七)线程池的大小如何确定
线程的使用目的是提高运行速度,提高运行的速度是要充分提用CPU和I/O 的利用率。
HaC
2020/12/30
1.7K0
线程池大小 + 线程数量到底设置多少?
抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程的指令 ** 那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。
Java小咖秀
2021/06/08
13.9K0
线程池大小 + 线程数量到底设置多少?
生产环境如何合理配置线程池呢?
主要看业务类型配置线程池: CPU密集型 IO密集型 CPU密集型 CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。 CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就那些。 CPU密集型任务配置尽可能少的线程数量: 一般公式:CPU核数+1线程的线程池 IO密集型 由于IO密集型任务线程并不是一直在执行任务,应配置尽可能多的线程,如CPU核数*2 I0密集型
名字是乱打的
2022/05/13
4100
Java线程池如何合理配置核心线程数
线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去探索吧!
allsmallpig
2022/01/06
3.9K0
Java线程池如何合理配置核心线程数
论如何优雅的自定义ThreadPoolExecutor线程池
更好的markDown阅读体验可直接访问我的CSDN博客:https://blog.csdn.net/u012881584/article/details/85221635
一枝花算不算浪漫
2018/12/28
1.4K0
别再纠结线程池大小/线程数量了,没有固定公式的
抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程的指令** 那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。
烂猪皮
2021/06/09
7910
别再纠结线程池大小/线程数量了,没有固定公式的
Java并发:如何确定线程池的线程数目
线程是操作系统中比较稀缺的资源,大量创建线程池,不仅消耗系统资源,还会导致系统稳定性降低,在JVM中,最终导致OOM发生。通过使用线程池,限制线程数目的创建,可重复利用已创建的线程。
崔认知
2023/06/19
2650
Java并发:如何确定线程池的线程数目
Java并发编程之线程池
Java中线程池是通过Executor框架实现的,该框架中用到了Executor,Executors(代表工具类),ExecutorService,ThreadPoolExecutor这几个类
冬天vs不冷
2025/01/21
1040
Java并发编程之线程池
线程池原理(2)
在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。
黑洞代码
2021/03/19
4960
线程池原理(2)
相关推荐
【原创】腾讯面试官:线程池要设置多大
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档