Java并发编程(四)——什么是线程

150 阅读3分钟

在介绍线程前,我们需要先了解一下线程的”母亲“——进程。
进程(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状态。