前言
JDK 21 正式将虚拟线程(Virtual Threads)作为一项特性发布,彻底改变了 Java 并发编程的格局。传统平台线程在面对高并发 I/O 密集型场景时,线程数受限于操作系统资源,开发者不得不借助异步编程或响应式框架来突破瓶颈。虚拟线程的出现让"每个请求一个线程"的简洁模型重新焕发生机——但用不对也会踩坑。
本文将系统梳理虚拟线程的原理、与平台线程的区别、正确使用方式以及常见问题。
1. 什么是虚拟线程
虚拟线程是由 JDK 而非操作系统管理的轻量级线程。它的工作原理可以概括为:
- 虚拟线程是用户态线程:由 JVM 调度,不直接映射到操作系统线程
- 载体线程(Carrier Thread):虚拟线程需要挂载到一个平台线程上才能执行
- 自动挂起/恢复:当虚拟线程遇到阻塞 I/O 操作时,JVM 自动将其从载体线程上卸载,载体线程可以去执行其他虚拟线程;I/O 完成后再恢复执行