MST

星途 面试题库

面试题:Java多线程中线程的生命周期及状态转换

请简述Java多线程中线程的生命周期有哪些状态,以及这些状态之间是如何转换的,并举例说明常见导致状态转换的方法。
42.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

线程生命周期的状态

  1. 新建(New):当一个Thread类或其子类的对象被创建时,线程就进入了新建状态,但此时线程还未开始运行。例如:Thread thread = new Thread(() -> System.out.println("Hello from thread"));
  2. 就绪(Runnable):调用start()方法后,线程进入就绪状态。此时线程等待CPU分配时间片,一旦获得CPU资源,就可以执行。例如:thread.start();
  3. 运行(Running):线程获得CPU时间片开始执行run()方法中的代码。
  4. 阻塞(Blocked)
    • 等待阻塞:调用Object类的wait()方法,线程会进入等待阻塞状态,直到其他线程调用notify()notifyAll()方法唤醒它。例如:
Object lock = new Object();
synchronized (lock) {
    try {
        lock.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
- **同步阻塞**:当线程试图访问一个同步代码块,而该代码块正被其他线程占用时,线程会进入同步阻塞状态,直到获取到锁。例如:
synchronized (this) {
    // 同步代码块
}
- **其他阻塞**:调用`Thread.sleep(long millis)`方法,线程会进入其他阻塞状态,在指定时间内不会获得CPU执行权。例如:`Thread.sleep(1000);`

5. 死亡(Terminated):线程执行完run()方法正常结束,或者因未捕获的异常而终止,线程进入死亡状态。例如:

Thread thread = new Thread(() -> {
    // 执行任务
});
thread.start();
// 线程执行完毕后进入死亡状态

状态转换

  1. 新建 -> 就绪:调用start()方法。
  2. 就绪 -> 运行:获得CPU时间片。
  3. 运行 -> 阻塞:调用wait()sleep()方法,或尝试获取同步锁失败等情况。
  4. 阻塞 -> 就绪wait()线程被notify()notifyAll()唤醒,sleep()时间结束,获取到同步锁等情况。
  5. 运行 -> 死亡run()方法执行完毕或抛出未捕获异常。