基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Java 中线程的生命周期(状态)具体包含哪几种?

知识点图片

在 Java 中,线程的生命周期(状态)由 java.lang.Thread.State 枚举类明确规定。具体来说,Java 线程的生命周期包含以下 6 种 状态:

1. NEW(新建)

  • 含义:线程对象已经被创建,但是还没有调用 start() 方法。
  • 说明:此时它只是一个普通的 Java 对象,操作系统中并没有真正的线程与之对应。
  • 示例Thread t = new Thread(); 此时 t 就是 NEW 状态。

2. RUNNABLE(可运行)

  • 含义:线程在 Java 虚拟机(JVM)中执行的状态。
  • 注意:Java 中的 RUNNABLE 状态包含了操作系统层面的就绪态(Ready)运行态(Running)
    • 就绪(Ready):线程已经准备好运行,正在等待获取 CPU 时间片。
    • 运行(Running):线程已经获取到 CPU 时间片,正在执行代码。
    • Java 并没有区分这两种状态,统一称为 RUNNABLE。
  • 转换:调用 t.start() 方法后,线程从 NEW 进入 RUNNABLE 状态。

3. BLOCKED(阻塞)

  • 含义:线程正在等待获取一个监视器锁(Monitor Lock),以便进入一个 synchronized 块或方法,或者在调用 Object.wait() 后被唤醒时重新进入 synchronized 块。
  • 说明BLOCKED 状态仅仅与 synchronized 关键字相关。如果使用 java.util.concurrent.locks 包下的锁(如 ReentrantLock),线程等待锁时是处于 WAITINGTIMED_WAITING 状态,而不是 BLOCKED

4. WAITING(无限期等待)

  • 含义:线程进入无限期等待状态,它在等待另一个线程执行特定的操作(如唤醒或中断)。处于该状态的线程不会被分配 CPU 时间片。
  • 触发条件(调用以下无超时参数的方法):
    • Object.wait():等待其他线程调用 notify()notifyAll()
    • Thread.join():等待指定的线程执行完毕(终止)。
    • LockSupport.park():等待其他线程调用 LockSupport.unpark()

5. TIMED_WAITING(限期等待)

  • 含义:与 WAITING 类似,但它有最大等待时间。在这个时间内,如果没有被唤醒,系统会自动唤醒它。处于该状态的线程也不会被分配 CPU 时间片。
  • 触发条件(调用以下带有超时参数的方法):
    • Thread.sleep(long millis)
    • Object.wait(long timeout)
    • Thread.join(long millis)
    • LockSupport.parkNanos()
    • LockSupport.parkUntil()

6. TERMINATED(终止)

  • 含义:线程已经执行完毕,生命周期结束。
  • 触发条件
    • 线程的 run() 方法正常执行结束。
    • 线程在执行过程中抛出了未捕获的异常(Exception)或错误(Error)导致意外结束。
  • 注意:一旦线程进入 TERMINATED 状态,就不能再调用 start() 方法重新启动,否则会抛出 IllegalThreadStateException

💡 核心状态转换关系总结

为了更好地理解,可以参考以下状态转换逻辑:

  1. NEW -> RUNNABLE:调用 start()
  2. RUNNABLE -> BLOCKED:尝试获取 synchronized 锁失败。
  3. BLOCKED -> RUNNABLE:成功获取到了 synchronized 锁。
  4. RUNNABLE -> WAITING / TIMED_WAITING:调用 wait(), sleep(), join(), park() 等方法。
  5. WAITING / TIMED_WAITING -> RUNNABLE:时间到期、被 notify/notifyAll 唤醒、被中断、或者 unpark()(注意:如果是 wait() 被唤醒,且没有获取到锁,会先进入 BLOCKED 状态)
  6. RUNNABLE -> TERMINATEDrun() 方法执行完毕或异常退出。

⚠️ 面试常考辨析

  • sleep()wait() 的区别?
    • sleep()Thread 类的静态方法,进入 TIMED_WAITING 状态,不会释放锁
    • wait()Object 类的方法,进入 WAITING/TIMED_WAITING 状态,必须在同步块中调用,并且会释放锁
  • BLOCKED 和 WAITING 的区别?
    • BLOCKED 是被动的,因为竞争 synchronized 锁失败而进入。
    • WAITING 是主动的,因为代码中调用了 wait()join()park() 等方法主动交出执行权。
00:00
00:00