Java虚拟线程是Project Loom实现的JVM托管轻量级并发单元,核心在于解耦逻辑单元与OS资源,通过M:N调度(百万虚拟线程复用少量载体线程)、KB级栈内存、用户态无锁切换,使同步代码天然支持高并发I/O,但不适用于CPU密集型任务。

Java 虚拟线程(Virtual Threads)不是“纤程”的简单翻译,而是 Project Loom 实现的、由 JVM 管理的轻量级并发单元。它颠覆传统线程模型的核心,不在于“更细的切分”,而在于彻底解耦“逻辑并发单元”与“操作系统调度资源”之间的强绑定关系。
打破 1:1 映射,实现 M:N 调度
传统 java.lang.Thread 是平台线程(Platform Thread),每个实例都对应一个 OS 内核线程,受系统限制(通常数千个)。虚拟线程则运行在少量载体线程(Carrier Threads)之上,JVM 动态调度成千上万个虚拟线程复用这些载体线程。
- 一个 HTTP 请求可分配一个虚拟线程,无需担心线程池大小或排队;
- 当该线程执行
Socket.read()或Thread.sleep()时,JVM 自动将其挂起,立即释放载体线程去服务其他就绪任务; - I/O 完成后,JVM 在任意空闲载体线程上恢复其执行,对开发者完全透明。
资源开销从 MB 级降到 KB 级
平台线程默认栈空间约 1MB,创建 10,000 个即占用 10GB 内存;虚拟线程初始栈仅约 256–512 字节,按需增长,且无内核态上下文切换开销。
- 内存压力骤降:百万级并发不再意味着百万 MB 内存;
- 创建/销毁近乎零成本:
Thread.ofVirtual().start(runnable)是纯 JVM 操作,无需系统调用; - 上下文切换在用户态完成,速度比 OS 级切换快 100 倍以上。
回归同步编程,消除回调地狱
过去为应对高并发 I/O,必须转向 CompletableFuture、Reactor 或 Netty 的异步非阻塞模型,导致代码割裂、调试困难、异常传播复杂。
立即学习“Java免费学习笔记(深入)”;
- 虚拟线程允许你写
db.query(...); http.post(...); return result;这样的直白同步代码; - JVM 自动处理背后的挂起/恢复,性能却接近甚至超越手动编排的异步链;
- 错误堆栈完整可读,断点调试自然,线程局部变量(
ThreadLocal)仍可用(但需谨慎,避免滥用)。
不是万能的:适用边界很明确
虚拟线程不是用来加速 CPU 密集型任务的。它优化的是“大量任务等待 I/O”的场景,而非“大量任务争抢 CPU”。
- 适合:Web 请求处理、数据库访问、消息消费、文件读写等 I/O 密集型负载;
- 不适合:图像渲染、加密计算、科学计算等 CPU 绑定型任务——这类任务应继续使用
ForkJoinPool或固定大小的平台线程池; - 注意陷阱:
synchronized块内做 I/O 会导致“钉住”(Pinning),使虚拟线程无法卸载(Java 24 已大幅缓解,但旧环境仍需规避)。


















