虚拟线程(Virtual Thread)是 JDK 21 正式引入的革命性特性,它让 Java 开发者可以用同步代码的风格编写高并发程序。但虚拟线程不只是"轻量级线程",它还带来了结构化并发(Structured Concurrency)和 Scoped Values 等新范式。本文将深入探讨虚拟线程的进阶用法、原理、陷阱以及与传统并发模型的对比。
一、虚拟线程 vs 平台线程
1.1 基本概念
┌──────────────────────────────────────────────────────────────┐
│ 平台线程 vs 虚拟线程 │
├──────────────────┬───────────────────┬───────────────────────┤
│ 特性 │ 平台线程 │ 虚拟线程 │
│ │ (Platform Thread) │ (Virtual Thread) │
├──────────────────┼───────────────────┼───────────────────────┤
│ 底层实现 │ OS线程(1:1映射) │ JVM调度(用户态) │
├──────────────────┼───────────────────┼───────────────────────┤
│ 内存占用 │ ~1MB栈空间 │ ~几KB(动态增长) │
├──────────────────┼───────────────────┼───────────────────────┤
│ 创建成本 │ 高(系统调用) │ 极低(Java对象) │
├──────────────────┼───────────────────┼───────────────────────┤
│ 上下文切换 │ 内核切换(~1μs) │ JVM切换(~100ns) │
├──────────────────┼───────────────────┼───────────────────────┤
│ 数量上限 │ ~数千 │ ~数百万 │
├──────────────────┼───────────────────┼───────────────────────┤
│ 调度方式 │ OS抢占式调度 │ ForkJoinPool协作式 │
├──────────────────┼───────────────────┼───────────────────────┤
│ 阻塞行为 │ 阻塞OS线程 │ 让出carrier线程 │
│ │ (浪费资源) │ (不浪费资源) │
├──────────────────┼───────────────────┼───────────────────────┤
│ 适用场景 │ CPU密集型 │ IO密集型 │
├──────────────────┼───────────────────┼───────────────────────┤
│ API │ Thread │ Thread.ofVirtual() │
│ │ │ Thread.startVirtualThread│
└──────────────────┴───────────────────┴───────────────────────┘
2026/7/3大约 17 分钟