并发编程 线程生命周期
本文将介绍 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 并发编程实战