start() 方法是线程启动入口,触发jvm状态校验、注册及native方法start0()调用,后者通过jvm_startthread创建javathread并委托os创建线程,最终由jvm调度器将线程置为runnable状态并执行run()。

Java 中 start() 方法是线程启动的入口,它不直接执行业务逻辑,而是触发 JVM 一整套线程管理机制的协同工作。这个过程不是纯 Java 层面的调用,而是一次从 Java 代码 → JVM 运行时 → 操作系统内核的逐层委托。
start() 触发 JVM 的线程状态校验与注册
调用 thread.start() 时,JVM 首先在 Java 层做基础合法性检查:
- 确认线程处于 NEW 状态(
threadStatus == 0),否则抛出IllegalThreadStateException - 将该线程加入所属线程组(
group.add(this)),纳入 JVM 统一线程生命周期管理范畴 - 调用本地方法
start0(),把控制权交予 JVM 运行时系统
start0() 是 Java 与 JVM 运行时的 JNI 桥梁
start0() 是一个 native 方法,由 JVM 用 C/C++ 实现,其核心作用是完成 Java Thread 对象到 JVM 内部线程结构体的映射:
- 在 OpenJDK 中,它最终调用
JVM_StartThread函数(位于jvm.cpp) - 该函数创建
JavaThread实例,并关联一个底层 OS 线程对象(osthread) - 关键动作是调用
os::start_thread(native_thread),正式向操作系统请求资源
JVM 向操作系统发起线程创建请求
这一层完全脱离 Java 语义,进入平台相关实现:
- 在 Linux 上,JVM 通常通过
pthread_create创建 POSIX 线程 - 新线程启动后,会立即执行 JVM 预设的入口函数(如
thread_entry),而非用户写的run() - 这个入口函数负责初始化 Java 栈、设置上下文,并最终在新线程中安全调用用户
run()方法
线程真正运行前的状态转换由 JVM 调度器接管
操作系统返回线程 ID 后,JVM 将其纳入调度体系:
- 线程状态从 NEW 变为 RUNNABLE(注意:不是 RUNNING)
- JVM 的线程调度器(基于 OS 调度策略)决定何时将该线程分配 CPU 时间片
- 只有获得 CPU 资源后,
run()方法才在线程私有栈上开始执行,此时才算真正“跑起来”
整个流程体现了 JVM 作为中间层的关键角色:它既抽象了不同操作系统的线程创建差异,又统一维护了 Java 线程模型(状态、优先级、中断、异常处理等),让开发者无需关心底层细节,只需专注业务逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











