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