面试题:如果一个线程在 Java 中被两次调用 start() 方法,会发生什么?

直接答案

会抛出 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. 正确做法

如果需要重新执行线程任务,应该:

  1. 创建新的线程实例Thread newThread = new Thread(...); newThread.start();
  2. 或者使用线程池管理线程生命周期

6. 常见误区

  • 误以为可以重复使用同一个线程对象
  • 混淆 start() 和 run() 方法(直接调用 run() 不会报错,但不会启动新线程)

总结

Java 的这种设计保证了线程状态的可控性,防止因重复启动导致的资源竞争和状态混乱。开发者应当遵循”一个线程对象只能启动一次”的原则,这是 Java 多线程编程的基本规范之一。

THE END
喜欢就支持一下吧
点赞11 分享