1. Java 线程的生命周期
粗略来看,Java 线程的生命周期一共有 5 种不同的状态:
- NEW:初始状态。刚被创立,还没有执行 start()办法。
- RUNNABLE:运行状态。因为 JAVA 的线程模型是一对一的内核级线程模型,所以线程外部理论还会有运行中和就绪两种状态,但从 Java 语言角度看统称为“运行态”。
- WAITED:期待状态。进入该状态示意 以后线程须要期待其余线程做出一些特定动作,依据是否设置超时工夫能够细分为“期待“和”超时期待“两种状态。
- BLOCKED:阻塞状态。示意 线程在获取锁的过程中失败被阻塞。
- TREMINATED:终止状态。线程执行结束。
而很多文章也会将期待和超时期待当做两个独立的状态,因而也会有 Java 线程有 6 种状态的说法,但实质都是一样的。
2. Java 线程状态变迁
java 线程在本身的生命周期中会随着代码执行在不同的状态之间进行切换,其状态变迁如下图所示:
状态变迁次要能够分为以下几类:
- 初始 ==> 运行:创立好的线程调用 start()办法进入运行状态
- 运行 ==> 终止:线程执行完 run()办法后完结
- 运行 <==> 期待:当线程执行 wait()办法或 LockSupport 的一些辅助办法,会进入到期待状态。此时线程须要依附其余线程告诉能力返回到运行状态。JUC 包 Lock 接口的阻塞实现均应用了 LockSupport 类的相干办法,因而调用 JUC 包中 Lock 接口理论进入的是期待状态而非阻塞状态。
- 运行 <==> 阻塞:线程在尝试进入 synchronized 关键字润饰的办法或代码块时获取锁失败会进入阻塞状态。
3. 期待态和阻塞态
在第二节里有一个状态没被提到:期待 ==> 阻塞。
其实理论状况下不会真的有这个状态的间接转换。当一个线程从期待态退出时,会先进入运行态,再尝试获取锁,锁竞争失败后进入阻塞态。该图特意用红色线画了一个 ” 谬误 ” 的状态变迁是想揭示读者,期待态和阻塞态是两个齐全不同的状态。
咱们能够认为阻塞态是对锁的竞争,由 JVM 主动治理这些参加竞争的线程,当其中一个线程从临界区退出时,JVM 会主动调度另一个竞争胜利的线程进入临界区。而期待态则是一个线程须要期待另一个线程的告诉,须要咱们手动治理线程之间的通信。
4. 参考资料
Java 并发编程的艺术
Java 线程中期待态和阻塞态的区别