美文网首页
多线程概念

多线程概念

作者: 小丸子的呆地 | 来源:发表于2021-07-16 11:10 被阅读0次

    什么是多线程?

    我们已经知道了线程是CPU 调度的最小单位,多线程就是我们在进程中启用多个线程去执行处理任务。

    为什么要用多线程?

    image.png

    在单核时代,如果是纯运算的操作是不需要多线程的,一个线程一直执行运算即可。但如果这个线程正在等待 I/O 操作,此时 CPU 就处于空闲状态,这就浪费了 CPU 的算力,因此有了多线程,在某线程等待 I/O 等操作的时候,另一个线程顶上,充分利用 CPU,提高处理效率。
    多线程的本意是充分利用CPU,让CPU一刻不停的为我们执行任务。为此,我们使用多线程技术,哪怕有一个线程因为程序或者IO等操作阻塞了,不能让CPU傻等着,而是去执行其他的任务。

    线程越多越好吗?

    答案是否定的,线程肯定不是越多越好。因为创建线程需要消耗资源,维持一个线程同样需要消耗资源,执行一个线程更需要切换上下文。
    CPU执行别的线程是需要切换线程上下文的,需要开销,比如替换寄存器的内容、高速缓存的失效等等。如果线程数太多,CPU为了雨露均沾,切换的频率就变高,可能使得多线程带来的好处抵不过线程切换带来的开销,得不偿失。

    线程数设置多少比较合理

    线程数的设置数量本身不是一个十分确定的事,需要根据其他很多的引入,比如CPU的核数、期望的CPU利用率、任务执行的情况。

    常规标准

    1. IO密集型程序,使用 核数*2+1
    2. 计算密集型程序,使用 核数+1

    《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法如下:

    线程数 = CPU 核心数 * (1 + IO 耗时/ CPU 耗时)

    有一派的计算方式是《Java虚拟机并发编程》中提出的:

    线程数 = CPU 核心数 / (1 - 阻塞系数)
    其中计算密集型阻塞系数为 0,IO 密集型阻塞系数接近 1,一般认为在 0.8 ~ 0.9 之间。

    相关文章

      网友评论

          本文标题:多线程概念

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