直接答案
会抛出 IllegalThreadStateException
异常。在 Java 中,一个线程对象只能被启动(start)一次,重复调用 start() 方法是非法操作。
详细解释
1. 线程生命周期状态
线程在被创建后有以下关键状态:
- NEW:线程被创建但尚未调用 start()
- RUNNABLE:调用 start() 后进入可运行状态
- TERMINATED:线程执行完毕
2. start() 方法的行为
- 第一次调用 start():
- 检查线程状态是否为 NEW
- 将线程状态改为 RUNNABLE
- JVM 调用线程的 run() 方法
- 第二次调用 start():
- 线程状态已不是 NEW(可能是 RUNNABLE 或 TERMINATED)
- 直接抛出 IllegalThreadStateException
3. 代码示例
Thread myThread = new Thread(() -> {
System.out.println("线程执行中...");
});
myThread.start(); // 正常启动
myThread.start(); // 抛出 IllegalThreadStateException
4. 底层原理
查看 Thread 类的 start() 方法源码:
public synchronized void start() {
if (threadStatus != 0) // 0 代表 NEW 状态
throw new IllegalThreadStateException();
// ... 其他启动逻辑 ...
}
5. 正确做法
如果需要重新执行线程任务,应该:
- 创建新的线程实例
Thread newThread = new Thread(...); newThread.start();
- 或者使用线程池管理线程生命周期
6. 常见误区
- 误以为可以重复使用同一个线程对象
- 混淆 start() 和 run() 方法(直接调用 run() 不会报错,但不会启动新线程)
总结
Java 的这种设计保证了线程状态的可控性,防止因重复启动导致的资源竞争和状态混乱。开发者应当遵循”一个线程对象只能启动一次”的原则,这是 Java 多线程编程的基本规范之一。
THE END