Java 线程模型
字数: 0 字 时长: 0 分钟
线程模型
- 用户态线程 (User-Level Thread)
jdk 1.0 的早期实现,完全由 JVM 在用户空间管理,开销小、速度快,但一个线程阻塞会导致整个进程阻塞
- 内核态线程 (Kernel-Level Thread)
Java 1.2 引入,HotSpot 采用此模型,Java 线程 1:1
映射到内核线程,可真正的并行执行,但是涉及内核态和用户态切换,开销大
- 混合模型 (协程)
jdk 21 提供虚拟线程(Virtual Threads
),本质上是协程的一种实现
- 本质:大量的用户态线程(虚拟线程)映射到少量的载体线程(
ForkJoinPool
内核线程) - 优势:兼容现有
Thread
API,无需关注协程底层即可适应高并发场景,避免上下文切换开销 - 场景:适合 I/O 密集型场景,例如网络服务、数据库访问等
JVM 创建 Native Thread
的流程
当调用 new Thread().start()
时:
- JAVA 创建一个
Thread
对象,初始化栈大小、优先级等参数 - JVM 内部检查线程参数 (如
-Xss
栈大小),调用pthread_create
(Linux) 或CreateThread
(Windows) 等操作系统 API 创建线程 - 新创建的 Native Thread 执行入口函数 (如
hotsopt/src/os/linux/vm/os_linux.cpp
中的java_start
函数), 初始化线程的 栈帧、程序计数器、寄存器状态,并关联 Java 层的Thread
对象 - Native Thread 跳转到 Java
Thread
的run()
方法的机器码入口,开始执行用户代码
线程中断
当调用 Thread.interrupt()
并不会直接操作 Native Thread
,而是设置 Thread
对象的中断状态位
如果 Native Thread
因 wait()
、sleep()
等阻塞时,JVM 注入中断信号时,会唤醒线程,抛出 InterruptedException
虚拟线程
每个 Native Thread
需要独立的内核栈 (通常 1~8
MB)和上下文切换成本,创建数量也受操作系统限制
而 JDK21 带来了革命性的虚拟线程(Virtual Thread
),多个 Virtual Thread
复用一个 Native Thread
,创建和调度开销都很小