Java 虚拟线程:轻量级并发革命
探索 JDK 21 虚拟线程,编写高并发应用而无需担心线程开销。 · 难度:入门 · +15XP
虚拟线程概述
虚拟线程(Virtual Thread)是 JDK 19 预览、JDK 21 正式发布的轻量级线程,由 JVM 管理而非操作系统。它们可以轻松创建数百万个,适合 I/O 密集型任务。
创建虚拟线程
// 使用 Thread.Builder
Thread vThread = Thread.ofVirtual().name("vt1").start(() -> {
System.out.println("Running in virtual thread");
});
// 使用 Executors.newVirtualThreadPerTaskExecutor()
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> System.out.println("Task"));
}
与传统平台线程对比
| 特性 | 平台线程 | 虚拟线程 |
|---|---|---|
| 创建成本 | 高(系统调用) | 极低 |
| 最大数量 | 有限(通常几千) | 数百万 |
| 调度 | OS 内核 | JVM 用户态 |
| 适用场景 | CPU 密集 | I/O 密集 |
注意事项
- 避免在虚拟线程中使用
synchronized块,推荐使用ReentrantLock。 - 虚拟线程不能使用
Thread.stop()等废弃方法。 - 对于 CPU 密集型任务,虚拟线程无优势。
示例:批量处理请求
List<Callable<String>> tasks = IntStream.range(0, 1000)
.mapToObj(i -> (Callable<String>) () -> "Task " + i + " done")
.toList();
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
List<Future<String>> futures = executor.invokeAll(tasks);
futures.forEach(f -> System.out.println(f.get()));
}
练习提示
在 starter code 中,创建 10 个虚拟线程,每个线程打印自己的名称和当前时间。