查看原文
其他

线程池创建多少线程比较合理?(一文帮你理解)

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约


每日英文

You’ll never find the right person, if you can’t let go of the wrong one.

如果你放不下那个错的人,那么你永远也找不到那个对的人。


每日掏心

你能欺骗我并不是因为你撒的谎有多高明,而是我愿意去相信你,你能伤害我并不是因为你有多厉害,而是我把你当朋友给了你这种机会。




来自:小鱼儿 | 责编:乐乐

链接:cnblogs.com/karlMa/p/11356041.html

程序员小乐(ID:study_tech)第 744 次推文   图片来自 Pexels


往日回顾:【图解】11张图搞懂分布式架构的演进过程



   正文   


在设置线程池线程个数的时候,经常会想到这个问题,是不是设置的线程数越多越好?理解这个问题之前我们要先清楚的知道我们为什么使用多线程。

为什么会使用多线程

使用多线程的主要目的我们应该都能回答的出来就是提高程序的性能,这个提高性能其实是指 降低延迟 (发送请求到接收到数据的时间)和 吞吐量 (单位时间能可以处理更多的请求)。

降低延迟和提高吞吐量对应的方法有两种: 优化算法 和 将机器的硬件性能发挥到极致

  • 优化算法:降低时间和空间复杂度,使得程序执行时间更短。

  • 将硬件的性能发挥到极致,具体的指提高I/O 和cpu的利用率

如何提高I/O 和cpu的利用率的举例:

如果单核系统中 只有一个程序执行又有IO操作 和Cpu计算的代码,当程序执行IO操作的时候,Cpu其实是空闲的,反之IO是空闲的,如果这个时候用两个线程去跑这段代码,一个线程执行IO操作 ,一个线程执行Cpu计算 ,这时IO和Cpu的利用率是不是发挥了极致?

创建多少线程比较合适

经过上面的分析,我们知道创建多少线程能够将硬件的利用率达到最高才是最好的线程数。

我们从线程的应用场景来分析, 由于IO操作比Cpu计算耗时要久的多的,如果我们一段程序有IO操作 和 Cpu计算 我们可以称之为:IO密集型计算。程序中没有IO操作 只有Cpu的话 称之为Cpu密集型程序。

IO密集计算:如何将硬件利用率达到极致呢 我们将 R = IO耗时 / Cpu耗时 我们从上面的例子来看 如果IO耗时/Cpu耗时 = 10 (我们平常可以用工具apm来统计这个比例) 创建线程A 执行io操作 我们希望IO操作的时候 Cpu不能闲着 所以就应该创建10个线程去执行Cpu计算 当Io操作完毕后刚好Cpu也执行完毕 ,他们的利用率都是百分之100 在执行这段代码的时候。

这个例子我们要创建 1+ 10 = 11个线程执行起来效率更高,于是我们就得到了公式: 1+ I/O耗时/Cpu耗时,如果是多核Cpu 最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / Cpu 耗时)

Cpu密集型:这个就很简单了 Cpu的核数 = 线程数就行,一般我们会设置 Cpu核数+1 防止由于其他因素导致线程阻塞等。

结束语

看到这里想必大家在回答创建多个线程比较合理这个问题有了新的思路,希望能够帮助各位小伙伴,

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入程序员小乐技术群,在公众号后台回复“加群”或者“学习”即可。

猜你还想看


阿里、腾讯、百度、华为、京东最新面试题汇集

分析 Spring 框架中的装配模式

JVM内存结构解析,看了都说好!

【面试】你知道Java里有多少种锁吗?(15种锁最全总结)


关注「程序员小乐」,收看更多精彩内容
嘿,你在看吗?
: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存