
线程一共6 种状态。线程在生命周期内会随着代码执行、锁竞争、等待操作在不同状态之间切换。注意Java 线程状态和操作系统内核线程状态不是完全等同的我们这里讨论的是 Java 虚拟机层面定义的线程状态。1. 线程的总数量和含义在 Java 中线程的状态由枚举类java.lang.Thread.State定义线程一共存在 6 种状态分别是NEW新建RUNNABLE可运行BLOCKED阻塞WAITING无限等待TIMED_WAITING限时等待TERMINATED终止只要线程状态不是 NEW 和 TERMINATED线程都属于存活状态isAlive() true。1.1NEW 新建状态线程对象刚刚new创建出来任务已安排但还没有调用start()方法线程没有真正启动。 通俗理解工作已经安排好但是还没有开始行动。1.2RUNNABLE 可运行状态调用start()方法后进入该状态。 该状态包含两种情况即将开始工作就绪状态 READY正在工作中运行状态 RUNNING 通俗理解线程随时可以被 CPU 执行正在排队或者正在运行。1.3 BLOCKED 阻塞状态线程等待获取 synchronized 同步锁时的状态。 当线程想执行同步代码块 /同步方法但是锁被其他线程占用当前线程就会进入阻塞状态直到获取到锁。 通俗理解排队等待别人释放锁资源。1.4 WAITING 无限等待状态线程主动进入无期限等待需要被其他线程唤醒否则一直等待。 进入条件调用wait()、join()、LockSupport.park()。 通俗理解原地等待不主动苏醒必须别人通知。1.5 TIMED_WAITING 限时等待状态带时间限制的等待状态等待时间结束自动唤醒也可以被提前唤醒。 进入条件调用sleep(时间)、wait(时间)、join(时间)。 通俗理解等待一段时间时间到了自动继续执行。1.6 TERMINATED 终止状态线程任务执行完毕或者出现异常结束线程生命周期彻底结束。 处于该状态的线程无法再次启动。 通俗理解工作全部完成线程结束。2. 线程状态切换条件完整流转NEW → RUNNABLE调用线程的start()方法线程正式启动。RUNNABLE ↔ BLOCKEDRUNNABLE → BLOCKED线程竞争synchronized锁失败锁被占用。 BLOCKED → RUNNABLE线程成功获取到同步锁。RUNNABLE ↔ WAITINGRUNNABLE → WAITING执行wait()、join()等方法。 WAITING → RUNNABLE被其他线程notify()/notifyAll()唤醒或等待线程结束。RUNNABLE ↔ TIMED_WAITINGRUNNABLE → TIMED_WAITING执行sleep()、带超时的wait()/join()。 TIMED_WAITING → RUNNABLE等待时间超时或被提前唤醒。RUNNABLE → TERMINATED线程任务执行完毕或运行中出现异常线程终止。3. 代码示例3.1 观察 1NEW、RUNNABLE、TERMINATED 基础状态转换public class ThreadStateTransfer { public static void main(String[] args)throws InterruptedException { Thread tnew Thread(()-{ for (int i 0; i 100_000; i) { //空循环,消耗CPU } },李四); //NEW状态 System.out.println(t.getName():t.getState()); t.start(); //线程存货时循环打印状态 while (t.isAlive()){ System.out.println(t.getName():t.getState()); } //TERMINATED状态 System.out.println(t.getName():t.getState()); } }运行结果:new Thread()之后线程状态为NEW调用start()后变为RUNNABLE循环执行结束线程进入TERMINATED。3.2 观察 2BLOCKED、WAITING、TIMED_WAITING 状态转换public class ThreadStateDemo2 { public static void main(String[] args) { final Object objectnew Object(); Thread t1new Thread(new Runnable() { Override public void run() { synchronized (object){ try { // Thread.sleep(1000); // 打开这行t1状态 TIMED_WAITING object.wait(); // 打开这行t1状态 WAITING } catch (InterruptedException e) { e.printStackTrace(); } } } },t1); t1.start(); Thread t2new Thread(new Runnable() { Override public void run() { synchronized (object){ System.out.println(hehe); } } },t2); t2.start(); } }运行结果:当t1执行Thread.sleep(1000)使用jconsole观察t1 状态为TIMED_WAITINGt2 抢不到锁状态为BLOCKED。修改代码把 sleep 换成object.wait()t1 状态变为WAITINGt2 依旧是BLOCKED。结论BLOCKED 表示等待获取锁WAITING 和 TIMED_WAITING 表示等待其他线程发来通知。TIMED_WAITING 线程在等待唤醒但设置了时限WAITING 线程在无限等待唤醒。4.总结Java 线程一共6 种状态NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。RUNNABLE 包含就绪和运行两种子状态。BLOCKED 是等待 synchronized 锁WAITING/TIMED_WAITING 是等待其他线程通知。线程终止后不可重启只有 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 属于存活状态。