描述

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

基本知识

为什么要使用多线程?

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

简而言之,充分利用 CPU

程序的两种情况

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

1. CPU 密集型程序

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

单核CPU分4个线程
面试官问你:创建多少个线程是最优的
呵呵你会发现没啥用,还多了一些线程切换的时间

多核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耗时))

相关文章:

  • 2022-01-13
  • 2021-08-17
  • 2021-05-11
  • 2021-04-17
  • 2022-02-02
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2021-07-09
相关资源
相似解决方案