线程的几种状态

一.六种状态

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():无限阻塞线程

    java 复制代码
    synchronized (lock) {
        lock.wait(); // RUNNABLE → WAITING
    }
    new Thread(() -> {}).join(); // RUNNABLE → WAITING
    LockSupport.park(); // RUNNABLE → WAITING

    5. 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 是线程活跃状态。
相关推荐
guodingdingh1 分钟前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯2 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code5 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程