并发编程 多线程

本文将说明多线程机制。

一、进程与线程

具体请看:

操作系统 并发 - 一、进程与线程

二、为什么要使用多线程?

使用多线程的目的是为了提升性能。

衡量性能的指标有很多,其中最核心的是:

  • 延迟:发出请求到收到响应的时间;延迟越短越好
  • 吞吐量:单位时间内能处理的请求个数;吞吐量越大越好

因此,我们希望通过多线程实现降低延迟、提高吞吐量的目的。

三、多线程如何提升性能?

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 并发编程实战