Java多线程状态转换详解

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

Java面试题之多线程 线程的状态转换?

回答:

在Java中,线程的状态转换主要有以下几种状态:

  1. 新建状态 (New)

    • 当一个线程被创建但尚未启动时,它处于新建状态。此时,线程对象已经被创建,但start()方法尚未被调用。
    Thread thread = new Thread();
    
  2. 就绪状态 (Runnable)

    • 当调用start()方法后,线程进入就绪状态。此时,线程可以被调度执行,但并不一定立即执行。就绪状态的线程会等待CPU的调度。
    thread.start();
    
  3. 运行状态 (Running)

    • 当线程获得CPU的控制权并开始执行其任务时,它处于运行状态。此时,线程正在执行其run()方法。
  4. 阻塞状态 (Blocked)

    • 当线程试图获取一个被其他线程占用的锁时,它会进入阻塞状态。此时,线程无法继续执行,直到获得锁。
  5. 等待状态 (Waiting)

    • 线程可以进入等待状态,通常是通过调用Object.wait()Thread.join()LockSupport.park()等方法。处于等待状态的线程会一直等待,直到其他线程通知它(例如调用notify()notifyAll())或中断。
  6. 超时等待状态 (Timed Waiting)

    • 线程在调用Thread.sleep(millis)Object.wait(millis)Thread.join(millis)LockSupport.parkNanos()等方法时,会进入超时等待状态。线程会在指定的时间后自动返回就绪状态。
  7. 终止状态 (Terminated)

    • 当线程的run()方法执行完毕,或者由于异常而终止时,线程进入终止状态。此时,线程的生命周期结束,无法再被启动。

状态转换示意图

New -> start() -> Runnable
Runnable -> (scheduler) -> Running
Running -> (wait for lock) -> Blocked
Running -> (wait) -> Waiting
Waiting -> (notify) -> Runnable
Running -> (sleep) -> Timed Waiting
Timed Waiting -> (timeout) -> Runnable
Running -> (end) -> Terminated

总结

线程的状态转换是多线程编程中非常重要的概念,理解这些状态及其转换有助于更好地管理和优化线程的使用。在实际开发中,合理使用线程的状态可以提高程序的性能和响应能力。