在介绍线程前,我们需要先了解一下线程的”母亲“——进程。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是数据及其组织形式的描述,进程是程序的实体。
简单来说,Windows系统中的.exe文件,linux/MacOS中的可执行文件,这些都是程序;而当我们将这些可执行文件执行起来的时候,程序中的指令就会被加载,就得到了这个程序的一个进程。下图显示了MacOS中当前正在运行中的进程。
用专业些的术语来说,线程就是轻量级的进程,是程序执行的最小单位。之所以使用多线程进行并发程序的设计,是因为线程间的切换和调度成本远远小于进程。下图描述了线程的生命周期:
- NEW状态表示线程刚刚创建,此时线程还没开始执行
- 当线程调用start()方法后,线程处于RUNNABLE阶段,表示线程已经准备就绪,等待运行
- 线程获取到资源后就会开始执行run()方法内的指令,此时处于RUNNING阶段
- 如果线程在执行过程中调用了sleep()、wait()、suspend()方法,或遇到IO阻塞、同步锁阻塞时,就会挂起进入BLOCKED状态,暂停执行,等待阻塞时间结束,返回到RUNNABLE状态(注意这里,线程的BLOCKED状态结束后不会立刻继续运行,而是出于RUNNABLE状态,等待获取到资源后才会继续运行)
- 线程运行结束后,就会释放资源进入TERMINATED状态,表示线程已结束 以上五种状态,NEW->RUNNABLE和RUNNABLE/RUNNING->TERMINATED这两个执行路径是不可逆的,即线程不能从RUNNABLE状态返回到NEW状态,也不能从TERMINATED状态返回到RUNNABLE/RUNNING状态。