如果一个线程两次调用start(),会出现什么问题?
如果一个线程对象(Thread 实例)调用两次 start() 方法,Java 虚拟机会抛出一个 IllegalThreadStateException 异常。
一、详细解释:
1. start() 方法的作用
start()会启动一个新线程,导致线程进入 可运行(RUNNABLE)状态,JVM 调度执行run()方法。- 线程一旦启动(调用
start()),线程状态从NEW变为RUNNABLE,线程进入生命周期的运行阶段。
2. 为什么不能调用两次?
- Java 线程对象对应一个线程生命周期,
start()只能调用一次。 - 如果线程已经启动,再次调用
start()是非法操作。 - JVM 会检测线程状态,如果状态不是
NEW,调用start()就抛出异常。
二、代码示例
public class ThreadStartTwiceDemo {
public static void main(String[] args) {
Thread t = new Thread(() -> {
System.out.println("线程运行中...");
});
t.start();
try {
t.start(); // 第二次调用,抛出异常
} catch (IllegalThreadStateException e) {
System.out.println("异常捕获:线程已启动,不能再次调用start()");
}
}
}
输出结果:
线程运行中...
异常捕获:线程已启动,不能再次调用start()
三、线程状态与生命周期简述
| 线程状态 | 是否允许调用 start() |
|---|---|
| NEW | 允许 |
| RUNNABLE、BLOCKED、WAITING、TIMED_WAITING | 不允许,调用会异常 |
| TERMINATED | 不允许,调用会异常 |
四、设计原因
- 线程启动后,其执行代码在底层线程已经存在,允许重新调用
start()会导致不可预测行为。 - JVM 通过状态机防止非法调用,保证线程模型一致性。
五、参考资料
- Java官方文档 – Thread.start()
- 《Java并发编程实战》 – 线程生命周期章节
- Stack Overflow – Calling start() twice throws IllegalThreadStateException
更多详细内容请关注其他相关文章!