如果一个线程两次调用start(),会出现什么问题?
                           
天天向上
发布: 2025-07-28 20:51:59

原创
166 人浏览过

如果一个线程对象(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 通过状态机防止非法调用,保证线程模型一致性。

五、参考资料


更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *