start0()是thread.start()调用的native方法,由jvm通过jni绑定到c++的jvm_startthread函数,经javathread创建、os::create_thread()调用pthread_create()等系统api完成os线程创建。

Java 多线程中,Thread.start() 是启动线程的唯一合法方式,而它背后真正起作用的是本地方法 start0()。理解这个方法,就等于抓住了 JVM 如何把 Java 层线程映射为操作系统真实线程的关键链条。
start0() 是 Java 与 JVM 的 JNI 桥梁
start0() 是一个 private native void 方法,没有 Java 实现,它的职责是把当前 Thread 对象“提交”给 JVM 运行时系统。JVM 通过 JNI(Java Native Interface)机制,在底层用 C/C++ 实现该方法,最终调用 JVM_StartThread 函数(位于 OpenJDK 的 jvm.cpp 中)。这一步完全脱离 Java 字节码执行模型,进入 JVM 运行时的 C++ 世界。
JVM_StartThread 完成线程结构体初始化
该函数核心做两件事:
- 根据传入的 Java
Thread对象,创建一个JavaThread实例——这是 JVM 内部对线程的抽象,包含 Java 栈、程序计数器、GC 相关状态等 - 为该
JavaThread分配并关联一个OSThread对象,后者封装平台相关资源,比如 Linux 下的pthread_t句柄、内核线程 ID(_thread_id)等
OS 层线程创建由 JVM 委托操作系统完成
在 JavaThread 构建完成后,JVM 调用 os::start_thread(native_thread),正式向操作系统发起请求:
- Linux 平台:调用
pthread_create()创建 POSIX 线程 - Windows 平台:调用
_beginthreadex() - 新线程启动后,并不直接执行用户写的
run(),而是先运行 JVM 预设的 C++ 入口函数(如thread_entry),用于初始化 Java 执行环境(如设置 TLS、构建 Java 调用栈) - 待上下文就绪,才在新线程中安全地回调 Java 层的
run()方法
为什么不能绕过 start0() 直接调用 run()?
因为 run() 只是一个普通 public 方法,没有任何 JVM 协作逻辑:
- 它不会触发
start0(),也就不会创建JavaThread和OSThread - 不会分配独立栈空间,所有局部变量和调用帧都压在当前线程栈上
- 不会改变线程状态(
threadStatus仍为 0),JVM 调度器完全感知不到它的存在 - 本质上等价于
this.doWork(),只是语法上写成了thread.run()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











