一.六种状态
1.NEW(新建);
2.RUNNABLE(就绪);
3.BLOCKED(阻塞);
4.WAITING(等待);
5.TIMED_WAITING(定时等待);
6.TERMINATED(结束);
二.含义
1)NEW:线程创建之初,还没有经过start( )调用,此时线程仅存在于 JVM 内存中,未被操作系统调度
代码场景 :Thread thread = new Thread(() -> {}); 执行后,线程处于 NEW 状态。;
2)RUNNABLE:线程正在执行中或线程准备就绪,等待CPU分配时间。
3)BLOCKED:锁止状态,线程想进入锁(synchronized)对象的请求保持而阻塞。
4)WAITING:线程无限等待通知t.sleep(),t.join(),t.wait(),必须依赖其他线程唤醒,依赖notify(),notifyAll(),interrupt();
5)TIMED_WAITING:线程按照设定等待设定时间的等待,t.sleep(long),t.join(long),t.wait(long).
6)TERMINATED:线程执行完毕 ,或运行中抛出未捕获异常提前结束,生命周期彻底终止。
终止后的线程无法再次调用 start() 重启,会抛出 IllegalThreadStateException。
三.线程状态的切换
1)NEW->RUNNABLE:线程调用.start();
java
Thread thread = new Thread(() -> {}); // NEW
thread.start(); // 切换为 RUNNABLE
2). RUNNABLE → BLOCKED
切换条件 :线程等待获取 synchronized 独占锁(锁被其他线程持有)。
java
// 锁对象
private static final Object lock = new Object();
// 线程1:持有锁
new Thread(() -> {
synchronized (lock) {
while (true) {} // 一直持有锁
}
}).start();
// 线程2:无法获取锁,从 RUNNABLE → BLOCKED
new Thread(() -> {
synchronized (lock) {} // 等待锁
}).start();
3. BLOCKED → RUNNABLE
切换条件 :线程成功获取到 synchronized 独占锁(其他线程释放锁)。
4. RUNNABLE → WAITING
切换条件:调用 3 种无限等待方法(无超时参数):
-
Object.wait():释放锁,无限等待唤醒 -
Thread.join():等待目标线程执行完毕 -
LockSupport.park():无限阻塞线程javasynchronized (lock) { lock.wait(); // RUNNABLE → WAITING } new Thread(() -> {}).join(); // RUNNABLE → WAITING LockSupport.park(); // RUNNABLE → WAITING5. WAITING → RUNNABLE
切换条件:等待被唤醒 / 中断:
-
Object.notify()/notifyAll():唤醒wait()的线程 -
目标线程执行完毕:唤醒
join()的线程 -
LockSupport.unpark(线程):唤醒park()的线程
java
Thread.sleep(1000); // RUNNABLE → TIMED_WAITING
synchronized (lock) {
lock.wait(2000); // RUNNABLE → TIMED_WAITING
}
7. TIMED_WAITING → RUNNABLE
切换条件:
-
超时时间结束(自动苏醒)
-
提前被唤醒 / 中断
-
线程的
run()方法正常执行完毕 -
线程运行中抛出未捕获的异常 (RuntimeException/Error)
*java// 正常终止 Thread thread = new Thread(() -> { System.out.println("执行完毕"); }); thread.start(); // 执行完后 → TERMINATED // 异常终止 Thread thread2 = new Thread(() -> { throw new RuntimeException("异常退出"); }); thread2.start(); // 抛出异常后 → TERMINATED总结
- Java 线程固定 6 种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED;
- 核心状态切换:
start()启动线程 → 竞争锁 / 等待时暂停 → 唤醒 / 超时后恢复 → 执行完毕终止; - 关键区别:BLOCKED 是等锁,WAITING 是无限等待,TIMED_WAITING 是定时等待,RUNNABLE 是线程活跃状态。