并发编程 线程生命周期

本文将介绍 Java 中的线程生命周期。

一、线程生命周期

通用的线程生命周期可以表示为 “五态模型”,其中:

  • 初始状态:线程已被创建,但还不允许被 CPU 执行

    实质上是 “假创建”,线程在编程语言层面被创建,但还未在系统层面被创建

  • 可运行状态:线程可以被分配给 CPU 执行

    线程即在编程语言层面被创建,也在系统层面被创建

  • 运行状态:线程被分配给 CPU 执行

  • 休眠状态:运行状态的线程调用堵塞的 API(例如以堵塞方式读取文件)或者等待某个事件,其状态便会转换至休眠状态,同时释放 CPU 使用权

  • 终止状态:线程执行完或出现异常

二、Java 线程生命周期

1. 说明

Java 把可运行状态和运行状态合并,JVM 只关心线程是否 “在运行”,而不关心线程某一时刻是否 “在运行”,具体该线程合适能获取 CPU 使用权由操作系统调度。

2. 六种状态

Java 中的线程共有六种状态,分别是:

  • NEW(初始化状态):线程对象被创建后便是 NEW 状态

  • RUNNABLE(可运行 / 运行状态):如果线程对象被调用了 start() 方法,便会进入 RUNNABLE 状态

  • BLOCKED(阻塞状态):如果线程在 RUNNABLE 时发现需要等待 synchronized 锁,便会进入 BLOCKED 状态;当线程获取到锁后,便会回到 RUNNABLE 状态

  • WAITING(无时限等待):如果线程在 RUNNABLE 时,调用 Object.wait()Thread.join()LockSupport.park() 方法,便会进入 WAITING 状态

  • TIMED_WAITING(有时限等待):如果线程在 RUNNABLE 时,调用带超时参数的 Thread.sleep(时间)Object.wait(时间)Thread.join(时间)LockSupport.parkNanos(Object blocker, 时间)LockSupport.parkUntil(时间) 方法,便会进入 TIMED_WAITING 状态

  • TERMINATED(终止状态):线程执行完成、执行异常、被调用 stop()interrupt() 方法,便会进入 TERMINATED 状态

    不建议使用 stop()suspend()resume() 方法,它们会直接杀死线程,可能会因其占有的锁未释放导致其它线程无法顺利执行。建议使用 interrupt(),它会通知线程终止,并允许线程进行一些后续操作。

参考

  • Java 并发编程实战