面试官问你:创建多少个线程是最优的

描述

面试官如果问你,你有一个程序,创建多少个线程是最优的,你该如何回答

基本知识

为什么要使用多线程?

使用多线程就是在正确的场景下通过设置正确个数的线程来最大化程序的运行速度(让你的程序更快)

简而言之,充分利用 CPU

程序的两种情况

  • CPU密集型程序:计算量很大
  • I/O密集型程序: 用于I/O的时间很长

1. CPU 密集型程序

一个完整请求,I/O操作可以在很短时间内完成, CPU还有很多运算要处理,也就是说 CPU 计算的比例占很大一部分

单核CPU分4个线程
单核CPU
呵呵你会发现没啥用,还多了一些线程切换的时间

多核CPU分4个分线程
在这里插入图片描述
这就很厉害了,四个人一起同时来算,爽歪歪。

对于 CPU 密集型来说,理论上 线程数量 = CPU 核数(逻辑)就可以了,但是实际上,数量一般会设置为 CPU 核数(逻辑)+ 1 , 为什么呢?

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

  • 计算(CPU)密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。
    所以对于CPU密集型程序, CPU 核数(逻辑)+ 1 个线程数是比较好的经验值的原因了

2. I/O 密集型程序

与 CPU 密集型程序相对,一个完整请求,CPU运算操作完成之后还有很多 I/O 操作要做,也就是说 I/O 操作占比很大部分

I/O密集型程序分4个线程
在这里插入图片描述
这个图我来教大家怎么理解。有一个苹果,怎么把苹果吃完最优(注意,是吃完,而不是咬完)

答案是,用四个人,每人轮流咬一口(CPU操作),然后自行消化(I/O操作),然后再咬下一口

  • I/O 密集型程序的最佳线程数就是:

最佳线程数 = CPU核心数 * (1/CPU利用率) = CPU核心数 * (1 + (I/O耗时/CPU耗时))

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值