Skip to content

Java 线程模型

字数: 0 字 时长: 0 分钟

线程模型

  1. 用户态线程 (User-Level Thread)

jdk 1.0 的早期实现,完全由 JVM 在用户空间管理,开销小、速度快,但一个线程阻塞会导致整个进程阻塞

  1. 内核态线程 (Kernel-Level Thread)

Java 1.2 引入,HotSpot 采用此模型,Java 线程 1:1 映射到内核线程,可真正的并行执行,但是涉及内核态和用户态切换,开销大

  1. 混合模型 (协程)

jdk 21 提供虚拟线程Virtual Threads),本质上是协程的一种实现

  • 本质:大量的用户态线程(虚拟线程)映射到少量的载体线程(ForkJoinPool内核线程)
  • 优势:兼容现有 Thread API,无需关注协程底层即可适应高并发场景,避免上下文切换开销
  • 场景:适合 I/O 密集型场景,例如网络服务、数据库访问等

JVM 创建 Native Thread 的流程

当调用 new Thread().start() 时:

  1. JAVA 创建一个 Thread 对象,初始化栈大小、优先级等参数
  2. JVM 内部检查线程参数 (如 -Xss 栈大小),调用 pthread_create (Linux) 或 CreateThread (Windows) 等操作系统 API 创建线程
  3. 新创建的 Native Thread 执行入口函数 (如 hotsopt/src/os/linux/vm/os_linux.cpp 中的 java_start 函数), 初始化线程的 栈帧程序计数器寄存器状态,并关联 Java 层的 Thread 对象
  4. Native Thread 跳转到 Java Threadrun() 方法的机器码入口,开始执行用户代码

线程中断

当调用 Thread.interrupt() 并不会直接操作 Native Thread ,而是设置 Thread 对象的中断状态位

如果 Native Threadwait()sleep() 等阻塞时,JVM 注入中断信号时,会唤醒线程,抛出 InterruptedException

虚拟线程

每个 Native Thread 需要独立的内核栈 (通常 1~8 MB)和上下文切换成本,创建数量也受操作系统限制

而 JDK21 带来了革命性的虚拟线程Virtual Thread),多个 Virtual Thread 复用一个 Native Thread,创建和调度开销都很小

Java 线程生命周期

线程生命周期.webp