面试题:线程的生命周期在 Java 中是如何定义的?

在 Java 中,线程的生命周期由 java.lang.Thread 类定义,并通过 线程状态(Thread State) 来描述。线程的生命周期包括以下几个状态:


1. 线程的六大状态

Java 中线程的生命周期可以分为以下六种状态,定义在 Thread.State 枚举类中:

状态描述
NEW线程刚被创建,但尚未启动(未调用 start() 方法)。
RUNNABLE线程正在 JVM 中执行,可能正在运行,也可能在等待 CPU 时间片。
BLOCKED线程被阻塞,等待获取监视器锁(例如,进入 synchronized 代码块)。
WAITING线程处于等待状态,等待其他线程显式唤醒(例如,调用 wait() 方法)。
TIMED_WAITING线程处于限时等待状态,等待其他线程唤醒或超时(例如,调用 sleep() 或 wait(timeout))。
TERMINATED线程已经执行完毕,终止状态。

2. 线程状态转换图

以下是线程状态之间的转换关系:

NEW → RUNNABLE → BLOCKED → RUNNABLE → TERMINATED
            ↓        ↓
        WAITING ← TIMED_WAITING
  • NEW → RUNNABLE:调用 start() 方法后,线程进入 RUNNABLE 状态。
  • RUNNABLE → BLOCKED:线程尝试获取锁但失败,进入 BLOCKED 状态。
  • RUNNABLE → WAITING:线程调用 wait()join() 等方法,进入 WAITING 状态。
  • RUNNABLE → TIMED_WAITING:线程调用 sleep(timeout)wait(timeout) 等方法,进入 TIMED_WAITING 状态。
  • BLOCKED → RUNNABLE:线程成功获取锁,重新进入 RUNNABLE 状态。
  • WAITING/TIMED_WAITING → RUNNABLE:线程被唤醒(例如,notify()notifyAll())或超时,重新进入 RUNNABLE 状态。
  • RUNNABLE → TERMINATED:线程执行完毕,进入 TERMINATED 状态。

3. 代码示例

以下是一个简单的代码示例,展示线程状态的变化:

public class ThreadLifecycleExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(1000); // TIMED_WAITING
                synchronized (ThreadLifecycleExample.class) {
                    ThreadLifecycleExample.class.wait(); // WAITING
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println("State after creation: " + thread.getState()); // NEW

        thread.start();
        System.out.println("State after start: " + thread.getState()); // RUNNABLE

        Thread.sleep(500);
        System.out.println("State during sleep: " + thread.getState()); // TIMED_WAITING

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

        synchronized (ThreadLifecycleExample.class) {
            ThreadLifecycleExample.class.notify(); // Wake up thread
        }

        thread.join();
        System.out.println("State after termination: " + thread.getState()); // TERMINATED
    }
}

4. 总结

  • Java 中线程的生命周期由 六大状态 定义:NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITING 和 TERMINATED
  • 线程状态的转换由线程的行为(如调用 start()sleep()wait() 等方法)和外部条件(如锁的获取、唤醒操作)决定。
  • 理解线程的生命周期对于编写高效、可靠的多线程程序至关重要。
THE END
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容