start()开启新线程执行路径,run()仅在当前线程执行;调用start()后run()由JVM在新线程中自动调用,输出新线程名且并发运行;start()只能调用一次,run()可重复调用;start()是JVM层启动入口,run()是纯Java任务逻辑。

关键就一点:start() 是开启新执行路径的指令,run() 只是当前路径上的一段普通代码。
执行路径是否新增
调用 start() 会触发 JVM 向操作系统申请资源,创建一条独立的执行路径(即新线程),拥有自己的栈、PC 寄存器和调度身份;而 run() 没有这层机制,它只是当前线程方法调用栈里一次常规压栈,执行完就弹出,不产生任何新路径。
代码实际在哪跑
直接调用 run(),所有代码都在主线程(比如 main)里顺序执行,输出的 Thread.currentThread().getName() 一定是 “main”;调用 start() 后,run() 方法体由 JVM 在新线程中自动调用,此时输出的是新线程名(如 “Thread-0”),与主线程并发运行,输出顺序不可预测。
调用行为与限制
start() 是一次性契约操作:只能调用一次,重复调用抛 IllegalThreadStateException;run() 是普通 Java 方法,可反复调用,无状态约束,也不改变线程生命周期。
底层角色分工
start() 是 JVM 层面的线程启动入口,内部调用 native 的 start0(),最终对接 pthread_create 等系统 API;run() 是纯 Java 实现的任务容器,定义“做什么”,但不负责“谁来做”和“在哪做”。

















