十七、Java并发 Java Thread 生命周期
本文中,我想详细的讨论下 Java 中的核心概念 – 线程的生命周期。我会使用一张我自制的图片加上实用的代码片段,一步一步的详细剖析线程的各个状态和各个状态之间如何转换。
Java 中的多线程
Java 语言中, 多线程是由 Thread 的核心概念驱动的。因为多线程中的每一个线程都相互独立,有着自己的生命周期和状态转换。
我们先来看一张草图,这图描述了 Java 线程的各种状态和转换过程。

是不是很杂乱无章? 看不懂没关系,我们接下来会详细介绍各个状态。
Java 线程中的生命周期
Java 中,每一个线程都是 java.lang.Thread 类的实例。而且,Java 个线程生命周期中的各个状态都定义在 Thread 类的一个静态的 State 枚举中。
State 枚举定义了线程的所有潜在状态。总共有 6 个,分别对应者上图中的 6 个绿色背景的矩形和椭圆型。
- NEW : 新创建的,且未调用 start() 方法开始执行的线程。
- RUNNABLE : 已经在运行中的线程或正在等待资源分配的准备运行的线程。
- BLOCKED : 等待获取进入或重新进入同步块或方法的监视器锁的线程。
- WAITING : 等待其他一些线程执行特定操作,没有任何时间限制。
- TIMED_WAITING: 等待某个其他线程在指定时间段内执行特定操作
- TERMINATED : 线程完成了它的任务。
需要注意的是: 在任何给定的时间点,线程只能处于这些状态之一。
- NEW 状态,应该很好理解,比如,车,厂家生产出来,只要还没被卖出过,那么它就是新的 ( NEW )
- RUNNABLE 只要线程不出于其它状态,它就是 RUNNABLE 状态。怎么理解呢? 车买来了,只要它没坏没出什么毛病没借给别人,那么它就出于可开状态,不管是呆在家里吃灰还是已经在上路运行。
- WAITING : 无时间显示的等待其它线程完成任务时就处于这个状态,怎么理解呢?比如长假告诉公路大堵车,要等待别人前进了几个蜗牛步我们才能往前几个蜗牛步,有时候一等就是昏天暗地,可能长达几天,也可能,一辈子吧。