并发编程 多线程
本文将说明多线程机制。
一、进程与线程
具体请看:
二、为什么要使用多线程?
使用多线程的目的是为了提升性能。
衡量性能的指标有很多,其中最核心的是:
- 延迟:发出请求到收到响应的时间;延迟越短越好
- 吞吐量:单位时间内能处理的请求个数;吞吐量越大越好
因此,我们希望通过多线程实现降低延迟、提高吞吐量的目的。
三、多线程如何提升性能?
1. 多线程能够榨干 CPU
计算机有 CPU、I/O 设备两大主要硬件,其中 I/O 设备的速度远远慢于 CPU。
假设一个任务是:打开 txt 取出内容,做计算,打开 txt 存入内容。
如果单线程运行,需要花费大量的时间等待 I/O 操作,CPU 在此期间将无所事事;
如果多线程运行,操作系统可以在线程等待 I/O 操作时将其休眠,CPU 便可以执行其它线程的运算操作,避免无所事事。
多线程能够避免 CPU 等待,提升 CPU 的利用率。
2. 多线程能够榨干 I/O 设备
假设一个任务是:打开 txt 取出内容,做复杂计算,打开 txt 存入内容。
如果单线程运行,在 CPU 做复杂运算时,I/O 设备将无所事事;
如果多线程运行,CPU 可以调用线程 A 进行 I/O 操作后再切换至线程 B 进行运算,提升 I/O 设备的利用率。
3. 多线程能够拆分任务提升运算性能
对于多核 CPU 而言,多线程还能够将任务拆分交个多个核同时计算,提升运算性能。
4. 示例
假设任务需要 CPU 运算和 I/O 操作交替执行,且耗时 1:1。
在只有一个线程的情况下,执行 CPU 运算时,I/O 设备空闲;执行 I/O 操作时,CPU 空闲。CPU 与 I/O 设备的利用率都是 50%。
在两个线程的情况下,线程 A 执行 CPU 运算时,线程 B 可以执行 I/O 操作;线程 B 执行 I/O 操作时,线程 B 可以执行 CPU 运算。CPU 和 I/O 设备的利用率都是 100%。
通过增加线程数,吞吐量提升了一倍。
参考
- Java 并发编程实战