Java虚拟线程

什么是虚拟线程?

虚拟线程是一种用户态线程,由Java运行时管理,而不是直接映射到操作系统线程,可创建数百万个线程,内存占用极低(数 KB),适合高并发、大量短生命周期的任务(如 I/O 密集型任务),但不适于长时间运行的 CPU 密集型操作

创建虚拟线程的方法

可以通过
Thread.ofVirtual()Thread.startVirtualThread() 方法创建并启动虚拟线程
代码样例:
@~032QRYD(N_1HLFFM`ZJH

源码解析

在执行VirtualThread的start方法时,会把虚拟线程当作任务放到scheduler中执行
LLM`2}${59PGX{WY%{{ECC

跟进scheduler源码发现
D$4MQDWRXOHAQX%Z7UCK{N
(%A5BS%__IS_1`7~~KZ{(A
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)![2I7U@)BIQ106KI3%)$NYMTR

                     .mapToObj(IOTask::new)
                     .forEach(vtExecutor::submit);
        }   // try-with-resources 自动 awaitTermination

        long ms = (System.nanoTime() - start) / 1_000_000;
        System.out.printf("虚拟线程         耗时: %d ms%n", ms);
    }
}

2I7U@)BIQ106KI3%)$NYMTR

9X3)_~~MLKGZPT$LSX16UNX

维度 传统平台线程 虚拟线程 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 % 兼容,无需改代码
posted @ 2025-07-13 20:28  茴香儿  阅读(194)  评论(0)    收藏  举报