Java虚拟线程
什么是虚拟线程?
虚拟线程是一种用户态线程,由Java运行时管理,而不是直接映射到操作系统线程,可创建数百万个线程,内存占用极低(数 KB),适合高并发、大量短生命周期的任务(如 I/O 密集型任务),但不适于长时间运行的 CPU 密集型操作
创建虚拟线程的方法
可以通过
Thread.ofVirtual()或Thread.startVirtualThread() 方法创建并启动虚拟线程
代码样例:

源码解析
在执行VirtualThread的start方法时,会把虚拟线程当作任务放到scheduler中执行

跟进scheduler源码发现


scheduler实际上是一个ForkJoinPool线程池,主要通过这个scheduler来执行虚拟线程的任务
示例代码
进行100000个网络 I/O 任务模拟
// IOTask.java
public class IOTask implements Runnable {
private final int id;
public IOTask(int id) { this.id = id; }
@Override
public void run() {
try {
// 模拟 I/O 阻塞 200 ms
Thread.sleep(200);
} catch (InterruptedException ignored) {
}
}
}
传统线程实现
// TraditionalBare.java
import java.util.concurrent.CountDownLatch;
import java.util.stream.IntStream;
public class TraditionalBare {
public static void main(String[] args) throws Exception {
int TASKS = 100000;
CountDownLatch latch = new CountDownLatch(TASKS);
long start = System.nanoTime();
IntStream.range(0, TASKS)
.forEach(i -> {
new Thread(() -> {
new IOTask(i).run();
latch.countDown();
}).start();
});
latch.await();
long ms = (System.nanoTime() - start) / 1_000_000;
System.out.printf("耗时: %d ms%n", ms);
}
}
虚拟线程
// VirtualThread.java
import java.util.concurrent.*;
import java.util.stream.IntStream;
public class VirtualThread {
public static void main(String[] args) throws Exception {
int TASKS = 10_000;
long start = System.nanoTime();
try (ExecutorService vtExecutor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, TASKS)

| 维度 | 传统平台线程 | 虚拟线程 Virtual Thread |
|---|---|---|
| 调度模型 | 1:1(1 条 Java 线程 = 1 条 OS 线程) | M:N(多条虚拟线程复用少量 OS 线程) |
| 默认栈大小 | 1 MB(不可动态伸缩) | 几百~几千字节,可动态伸缩 |
| 创建/销毁成本 | 高(系统调用) | 极低(用户态,一次对象分配) |
| 最大并发数 | 千级(受内存 & OS 限制) | 百万级 |
| 阻塞代价 | 挂住 OS 线程 | 只挂住虚拟线程,OS 线程继续干活 |
| 上下文切换 | 内核态,~500-1000 ns | 用户态,~100 ns |
| 适用场景 | CPU 密集、长任务 | I/O 密集、大量短任务 |
| 编程模型 | Thread/Runnable/线程池 | 与 Thread 100 % 兼容,无需改代码 |

浙公网安备 33010602011771号