start() 通过 jvm 调用 native 方法 start0() 向操作系统申请线程资源并注册 run() 为入口,由新线程自动执行;而直接调用 run() 仅是普通方法调用,不创建新线程。

Java 中 start() 方法之所以能最终执行 run() 方法,靠的是 JVM 层面的协作,不是 Java 代码直接调用,而是一套由 JVM 控制的底层机制。
start() 触发本地方法 start0()
start() 是一个同步方法,它内部不做线程调度,只做合法性检查(比如是否已启动)和状态设置,核心动作是调用一个名为 start0() 的 native 方法:
-
start0()是用 C/C++ 实现的 JNI 方法,源码不可见,但它的职责是:向操作系统申请新线程资源,并注册该线程的入口函数为Thread.run() - JVM 在创建好底层 OS 线程后,会安排这个新线程去执行
Thread实例的run()方法
run() 方法本身不启动线程,只定义任务逻辑
Thread.run() 是一个普通 Java 方法,默认实现如下:
public void run() {
if (target != null) {
target.run();
}
}
- 这里的
target就是构造时传入的Runnable对象(如 new Thread(runnable).start() 中的 runnable) - 如果继承
Thread并重写了run(),那调用的就是子类版本;如果用的是Runnable方式,则实际执行的是target.run()—— 这是多态体现 - 注意:
run()没有任何线程创建逻辑,它只是被新线程“选中执行”的一段代码
关键区别:start() 启动线程,run() 只是方法调用
直接调用 thread.run() 和调用 thread.start() 完全不同:
-
thread.run():当前线程(比如 main)顺序执行该方法,无新线程产生,仍是单线程行为 -
thread.start():JVM 创建新 OS 线程,该线程独立运行,自动进入run()方法体,与调用线程并发执行
线程状态变化是 JVM 统一管理的
从 NEW 到 RUNNABLE 的跃迁,由 start0() 驱动:
- 调用
start()前:线程处于NEW状态(threadStatus == 0) - 调用
start()后:start0()成功返回 → 状态变为RUNNABLE→ 等待 CPU 调度 → 调度成功后执行run() - 一旦线程终止(
TERMINATED),再次调用start()会抛出IllegalThreadStateException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











