Java线程生命周期全解析:从入门到精通的终极指南!

引言

🔥 一文掌握线程六大状态 + 方法详解 + 状态切换原理,带你吃透面试高频考点!


📌 一、Java线程到底经历了几个状态?

Java 中的线程生命周期由 Thread.State 枚举定义,主要有以下 6个状态

public enum Thread.State {
    NEW,           // 新建
    RUNNABLE,      // 就绪/运行中
    BLOCKED,       // 阻塞(等待锁)
    WAITING,       // 无限等待
    TIMED_WAITING, // 限时等待
    TERMINATED     // 终止
}

🧭 二、线程生命周期状态切换图

                +-------------+
                |     NEW     |
                +-------------+
                      |
                      | start()
                      v
                +-------------+
                |  RUNNABLE   |<-------------------+
                +-------------+                    |
                 |    ^                            |
     获取CPU运行 |    | 线程阻塞或等待资源            |
                 v    |                            |
     +----------+----------+       超时/唤醒        |
     |   BLOCKED / WAITING |---------------------+  |
     |   / TIMED_WAITING   |                      |  |
     +---------------------+                      |  |
                 |                                 |  |
                 v                                 |  |
            +-------------+                        |  |
            | TERMINATED  |<-----------------------+  |
            +-------------+  run()执行完/抛异常       |


📖 三、六大状态逐个拆解(含源码视角)

1️⃣ NEW(新建)

Thread t = new Thread();
System.out.println(t.getState()); // NEW

2️⃣ RUNNABLE(可运行)

Thread t = new Thread(() -> {
    while (true) {}
});
t.start();
System.out.println(t.getState()); // RUNNABLE(可能)

3️⃣ BLOCKED(阻塞)

Object lock = new Object();
Thread t1 = new Thread(() -> {
    synchronized (lock) {
        try { Thread.sleep(5000); } catch (Exception ignored) {}
    }
});
Thread t2 = new Thread(() -> {
    synchronized (lock) {
        System.out.println("t2 acquired lock");
    }
});
t1.start(); t2.start();
Thread.sleep(1000);
System.out.println(t2.getState()); // BLOCKED

4️⃣ WAITING(无限等待)

Thread t = new Thread(() -> {
    synchronized (Thread.class) {
        try {
            Thread.class.wait();
        } catch (InterruptedException e) {}
    }
});
t.start();
Thread.sleep(1000);
System.out.println(t.getState()); // WAITING

5️⃣ TIMED_WAITING(限时等待)

Thread t = new Thread(() -> {
    try { Thread.sleep(5000); } catch (InterruptedException e) {}
});
t.start();
Thread.sleep(1000);
System.out.println(t.getState()); // TIMED_WAITING

6️⃣ TERMINATED(终止)

Thread t = new Thread(() -> System.out.println("done"));
t.start();
t.join();
System.out.println(t.getState()); // TERMINATED

🔧 四、常用线程方法详解

方法作用影响状态说明
start()启动线程NEW → RUNNABLE自动调用 run(),由 JVM 调度
run()线程逻辑不应手动调用 run()
sleep(ms)休眠RUNNING → TIMED_WAITING不释放锁
join()等待线程执行结束当前线程进入 WAITING/TIMED_WAITING可用于线程协作
interrupt()中断线程任意状态设置中断标志位或唤醒阻塞线程
wait() / wait(ms)等待锁/通知WAITING / TIMED_WAITING需在 synchronized 中使用
notify() / notifyAll()唤醒等待线程WAITING → RUNNABLE单个/全部唤醒

🧵 五、实战案例:线程状态切换模拟器

public class ThreadLifecycleDemo {
    public static void main(String[] args) throws Exception {
        Object lock = new Object();

        Thread thread = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread entering WAITING...");
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread resumed...");
            }
        });

        thread.start();
        Thread.sleep(1000);
        System.out.println("State after start: " + thread.getState()); // WAITING

        synchronized (lock) {
            lock.notify();
        }

        Thread.sleep(1000);
        System.out.println("State after notify: " + thread.getState()); // TERMINATED
    }
}

💡 六、面试真题强化训练

Q1:线程调用 sleep() 会释放锁吗?

❌ 不会释放锁!sleep() 只是让线程暂停,仍持有锁。

Q2:wait()sleep() 区别?

对比项wait()sleep()
是否释放锁✅ 是❌ 否
使用位置synchronized 内部任意
唤醒方式notify/notifyAll时间结束或 interrupt
异常InterruptedExceptionInterruptedException

Q3:线程池中线程怎么生命周期管理?

  • 实际线程由线程池统一调度:
    • 初次任务:NEW → RUNNABLE → TERMINATED
    • 重复利用:RUNNABLE ←→ TIMED_WAITING(keepAlive)

✅ 七、总结

状态含义常见触发方式
NEW新建,未 startnew Thread()
RUNNABLE就绪/运行中start()
BLOCKED等待锁synchronized
WAITING无限等待wait() / join()
TIMED_WAITING限时等待sleep() / wait(ms)
TERMINATED执行完成或异常run() 结束

📘 延伸阅读

  • 《Java 并发编程实战》
  • Java官方文档:Thread 类

💡 Java 线程到底有几个状态?每个状态用什么方法触发?这篇终极解析你必须收藏!不管是基础复习,还是面试通关,这一篇文章就够了!
📌 点赞 + 收藏 + 关注,每天带你掌握底层原理,写出更强健的 Java 代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿Mr.wu

你的鼓励师我创造最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值