Java 21+ 虚拟线程:适用场景、调度边界与迁移方法
Java 21+ 虚拟线程:适用场景、调度边界与迁移方法
基线:Java 21 LTS。Java 24/25 的虚拟线程实现和结构化并发 API 需要按目标 JDK 重新核对。
1. 适合什么
虚拟线程适合大量会阻塞在网络、文件或数据库 I/O 的任务。阻塞时虚拟线程可以卸载,平台线程继续承载其他任务。
它不会让 CPU 密集任务获得更多算力,也不会增加数据库连接池、远程服务或线程安全集合的容量。
2. 最小用法
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
Future<Response> future = executor.submit(() -> client.fetch(request));
Response response = future.get();
}
不要把虚拟线程提交到一个无限制的下游调用链。用 Semaphore、连接池和请求预算限制并发。
3. 迁移检查
检查 ThreadLocal 中是否保存大对象,阻塞调用是否真的可卸载,是否存在 synchronized 临界区、锁竞争、JNI 或 native 阻塞,取消和超时是否能传播。
JDK 21 时代的 pinning 诊断仍值得保留;目标 JDK 升级后重新阅读对应 JEP 和发布说明,不要把某个版本的内部实现当作 API 承诺。
4. 与异步 API 比较
虚拟线程让同步阻塞代码以较低线程成本运行,异步 API 则通过显式 continuation 或事件循环避免阻塞。选择应根据团队模型、库兼容性、调试方式和下游容量,而不是只看线程数量。
5. 压测方式
用同一连接池、超时、负载和下游服务,对平台线程、虚拟线程和异步实现分别测试吞吐、延迟、内存、取消和故障恢复。不要用 CPU 密集基准推导 I/O 结论。