美文网首页
创建多少个线程才合适(一)?

创建多少个线程才合适(一)?

作者: 苦逼的搬砖工 | 来源:发表于2020-06-08 20:08 被阅读0次

在创建线程之前我们需要考虑几个问题

1.创建多线程的目的是什么?

2.创建多线程的场景有哪些?

3.创建多个线程合适呢?

为什么要使用多线程

使用多线程本质上就是要提高程序的效率,脑海中想到的就是快,快,快!这种快是无法度量的,所以提升性能之前首先要考虑为什么快呢?

体现线程快的核心是延迟吞吐量,延迟就是每个发送请求到收到响应所消耗的时间;延迟越短,程序越快,性能也越好。吞吐量是指在单位时间内能处理的请求数量(QPS),吞吐量越大证明处理数据的越强,性能也就越好。

我们提升性能主要的目的就是降低延迟,提高吞吐量

多线程的使用场景

希望降低延迟,提高吞吐量的方法基本就两种,1:优化算法,2:将硬件的适用率达到最大化。硬件的提示主要是I/O和CPU的使用率

如果I/O和CPU的耗时是1:1

单线程执行示意图

如果只有一个线程执行CPU的时候I/O空闲,执行I/O的时候CPU空闲,所以I/O和CPU的利用率为50%

二线程执行示意图

如果是两个线程,线程A执行CPU操作的时候,线程B执行I/O,当线程A执行I/O操作的时候线程B执行CPU操作,这样CPU和I/O的利用率就是100%

例如:计算1 + 2 + ....+100亿如果在4核CPU和4个线程上执行就是A线程执行[1,25亿),线程B回显[25,50亿),线程C执行[50,75亿),线程D执行[75,100亿)理论上应该比一个线程执行的时间快乐将近4倍

创建多少个线程合适呢?

CPU密集型:

对于CPU密集型计算多线程本质上是提升CPU的使用率,所以对一个4核的CPU来说,理论上创建4个线程就可以了。在多创建只会增加线程切换的开销。所以对于CPU密集型的计算场景线程数 = CPU核数 + 1

《Java并发编程实战》加1的目的是计算(CPU)密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。

I/O密集型:

CPU和I/O的耗时如果是1:1那开2个线程是合适的,如果CPU和I/O的消耗是1:2那么开3个线程是合适的。

单核三线程执行示意图

如图显示:CPU 在 A、B、C 三个线程之间切换,对于线程 A,当 CPU 从 B、C 切换回来时,线程 A 正好执行完 I/O 操作。这样 CPU 和 I/O 设备的利用率都达到了 100%。

(长远一点看,第一轮CPU等待,第二轮自动就错开了)

线程等待时间所占比例越高,需要越多线程;线程CPU时间所占比例越高,需要越少线程。最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / CPU 耗时)] 

通过APM工具可以可以得到准确的耗时时间。

个人总结:个人觉得定性的I/O密集和CPU密集很难在定量上反应性能的瓶颈,因为我们在使用公式的时候完全就是忽略了线程直接的切换的开销。如果IO已经成了瓶颈,CPU的使用率就会降低,创建在多的线程都是浪费。不能单纯的靠公式计算线程数,理论加经验加实际场景。

问题:

1.我们已经知道创建多少个线程合适了,为什么还要搞一个线程池出来(二)?

2.创建一个线程都要做哪些事情?为什么说频繁的创建线程开销很大(三)?

3.多线程通常要注意共享变量问题,为什么局部变量就没有线程安全问题呢(四)?

相关文章

  • 创建多少个线程才合适(一)?

    在创建线程之前我们需要考虑几个问题 1.创建多线程的目的是什么? 2.创建多线程的场景有哪些? 3.创建多个线程合...

  • 创建多少个线程合适?

    1、CPU 密集型程序一个完整请求,I/O操作可以在很短时间内完成, CPU还有很多运算要处理,也就是说 CPU ...

  • Java运行main方法,会有多少个线程

    上面的代码在运行时,会创建多少个线程呢?答案是5(6)个。 Java中有线程组的概念,一个线程组可以包含线程和线程...

  • 线程池 - 基础

    corePollSize:核心线程数。在创建了线程池后,线程中没有任何线程,等到有任务到来时才创建线程去执行任务。...

  • 记录

    并发队列20个异步任务 串行队列20个异步任务 两中情况分别会创建多少个线程 主线程调用getmain函...

  • GCD会创建多少个线程

    关于GCD队列,系统队列编号有11个,1为主队列,2为管理队列,3保留;4-11为8个全局队列,优先级分别为LOW...

  • Executor家族-ThreadPoolExecutor

        创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。...

  • 线程池之运行过程原理

    在刚开始提交任务的时候,线程池会创建核心线程,等核心线程创建完毕,开始将任务加入阻塞队列,队列满了之后最后才创建非...

  • 创建多少线程才是合适的?

    多线程的应用场景要解决这个问题,首先要分析以下两个问题: 1 为什么要使用多线程? 使用多线程,本质上就是提升程序...

  • Java线程池

    1. 什么是线程池 创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的...

网友评论

      本文标题:创建多少个线程才合适(一)?

      本文链接:https://www.haomeiwen.com/subject/mnnrtktx.html