Java面试题更新 2026-08-05

在 Java 中,对同一个线程实例调用两次 start() 方法会有什么后果?请解释其内部机制。

技术原理问题排查Java

考察说明

考察对 Java 线程生命周期和状态转换的掌握。

回答思路

  1. 【回答框架 1】线程启动时会从 NEW 状态进入 RUNNABLE 状态。调用 start() 方法会让线程开始执行,但如果线程已经启动过,再次调用 start() 会抛出 IllegalThreadStateException。
  2. 【回答框架 2】因为线程状态转换是单向的,start() 只能从 NEW 状态调用,一旦线程进入 RUNNABLE 或后续状态,就不能再回到 NEW,所以重复调用 start() 是非法的。
  3. 【回答框架 3】在多线程环境下,对同一个线程对象可能产生竞态条件,但 start() 方法内部有状态检查,通常会在进入 RUNNABLE 前提早抛出异常,因此不会导致线程被多次启动。
  4. 【关键点 1】第二次调用 start() 会抛出 IllegalThreadStateException。
  5. 【关键点 2】线程状态从 NEW 转换到 RUNNABLE 后不可逆,因此无法再次启动同一个线程实例。
  6. 【关键点 3】正确做法是创建新的 Thread 实例来再次执行相同任务。
  7. 【易错点 1】不要误以为二次调用 start() 会让线程重新执行 run() 方法。
  8. 【易错点 2】避免通过调用 run() 方法来启动线程,这不会创建新线程,而是在当前线程中执行。