什么是多线程?
我们已经知道了线程是CPU 调度的最小单位,多线程就是我们在进程中启用多个线程去执行处理任务。
为什么要用多线程?
![](https://img.haomeiwen.com/i19104673/e8eb30569f71e1c9.png)
在单核时代,如果是纯运算的操作是不需要多线程的,一个线程一直执行运算即可。但如果这个线程正在等待 I/O 操作,此时 CPU 就处于空闲状态,这就浪费了 CPU 的算力,因此有了多线程,在某线程等待 I/O 等操作的时候,另一个线程顶上,充分利用 CPU,提高处理效率。
多线程的本意是充分利用CPU,让CPU一刻不停的为我们执行任务。为此,我们使用多线程技术,哪怕有一个线程因为程序或者IO等操作阻塞了,不能让CPU傻等着,而是去执行其他的任务。
线程越多越好吗?
答案是否定的,线程肯定不是越多越好。因为创建线程需要消耗资源,维持一个线程同样需要消耗资源,执行一个线程更需要切换上下文。
CPU执行别的线程是需要切换线程上下文的,需要开销,比如替换寄存器的内容、高速缓存的失效等等。如果线程数太多,CPU为了雨露均沾,切换的频率就变高,可能使得多线程带来的好处抵不过线程切换带来的开销,得不偿失。
线程数设置多少比较合理
线程数的设置数量本身不是一个十分确定的事,需要根据其他很多的引入,比如CPU的核数、期望的CPU利用率、任务执行的情况。
常规标准
- IO密集型程序,使用 核数*2+1
- 计算密集型程序,使用 核数+1
《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法如下:
线程数 = CPU 核心数 * (1 + IO 耗时/ CPU 耗时)
有一派的计算方式是《Java虚拟机并发编程》中提出的:
线程数 = CPU 核心数 / (1 - 阻塞系数)
其中计算密集型阻塞系数为 0,IO 密集型阻塞系数接近 1,一般认为在 0.8 ~ 0.9 之间。
网友评论