JVM--虚拟线程

首先了解一个理念:线程与 OS 线程 1:1 绑定

在传统 Java 线程(平台线程)模型中:

  1. 每个 Java 线程直接对应一个操作系统级别的线程

  2. 操作系统负责调度这些线程

  3. 线程的创建、管理和调度都由操作系统内核处理

  4. 这种模型称为 1:1 线程模型(一个用户线程对应一个内核线程)

图解传统线程模型

虚拟线程的 M:N 模型

什么是虚拟线程

1. 什么是虚拟线程?

虚拟线程是一种轻量级的线程,由JVM管理,而不是操作系统。它们被设计用来显著减少编写、维护和观察高吞吐量并发应用程序的工作量。

传统线程(平台线程):每个线程都直接对应一个操作系统线程(内核线程)。创建大量平台线程会消耗大量系统资源(内存和调度开销),因此限制了应用程序的并发能力。

虚拟线程 :它们是用户模式的线程,由JVM调度 ,多个虚拟线程可以运行在**同一个平台线程(称为载体线程)**上。虚拟线程的创建和切换成本极低,因此可以创建数百万个虚拟线程而不会导致系统资源耗尽。

2. 为什么需要虚拟线程?

在传统的"一个请求一个线程"的服务器应用程序中,由于平台线程的资源限制,通常只能处理数千个并发连接。当有大量I/O等待时(如数据库调用、网络请求),线程被阻塞,导致资源浪费。

虚拟线程通过以下方式解决

高效阻塞:当虚拟线程执行阻塞操作(如I/O)时,它会自动从载体线程上卸载,从而释放载体线程去执行其他虚拟线程。当阻塞操作完成时,虚拟线程会被调度到某个载体线程上继续执行。

高并发:可以创建大量虚拟线程(如百万级别),使得每个请求可以在自己的虚拟线程中运行,而无需复杂的异步编程模型(如CompletableFuture或反应式编程)。

Java 虚拟线程

前言

虚拟线程(Virtual Threads)是 Java 并发模型的革命性创新,在 Java 19 作为预览特性引入,Java 21 正式发布。这是 Project Loom 的核心成果,旨在解决传统线程的瓶颈问题。


一、核心问题:传统线程的局限性

传统的Java线程

java 复制代码
// 传统线程模型(平台线程)
ExecutorService executor = Executors.newFixedThreadPool(200);
for (int i = 0; i < 10_000; i++) {
    executor.submit(() -> {
        Thread.sleep(1000); // 模拟I/O阻塞
        return processRequest();
    });
}); }

痛点

  1. 线程与 OS 线程 1:1 绑定

  2. 创建 10k 线程 → 内存耗尽(1线程≈1MB栈)

  3. 上下文切换开销大(微秒级)

  4. 阻塞操作浪费 CPU 资源

一、如何创建虚拟线程

1. 直接创建
java 复制代码
 // 1. 使用静态方法 `Thread.startVirtualThread(Runnable)
    Thread.startVirtualThread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Hello, Virtual Thread!");
        }
    });

 //2.(推荐使用)使用构建器模式 `Thread.ofVirtual().name("name").start(Runnable)
       // name方法
         // - 第一个参数 `"vt-"` 是名称前缀。
         //- 第二个参数 `1` 是起始序号。
         //- 实际生成的线程名称将是 `"vt-1"`、`"vt-2"`、`"vt-3"` 等,每次创建一个新线程时序号自动增加。

    Thread vt = Thread.ofVirtual().name("vt-", 1)
                .start(() -> {
                    System.out.println("Running in virtual thread");
                 });
2. 线程池(推荐)
java 复制代码
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i < 100_000; i++) {
        executor.submit(() -> {
            // 处理请求(含I/O阻塞)
            return processRequest();
        });
    }
} // 自动关闭

核心区别对比表

特性 传统线程(平台线程) 虚拟线程
与OS关系 1:1 绑定(直接对应OS线程) M:N 映射(JVM管理)
内存开销 约 1MB/线程(默认栈大小) 约 200B-2KB/线程
创建数量上限 通常数千个 数百万个
创建速度 毫秒级(涉及OS调用) 微秒级(纯JVM操作)
阻塞成本 整个OS线程被阻塞 仅虚拟线程暂停,载体线程释放
调度器 操作系统内核 JVM(用户态)
上下文切换 内核介入,开销大(微秒级) JVM管理,开销极小(纳秒级)
典型使用场景 new Thread() 或固定大小线程池 Thread.ofVirtual().start() 或虚拟线程池
相关推荐
老虎062717 小时前
Java基础面试题(1)—Java优势(JVM,JRE,JIT,Java类,方法)
java·开发语言·jvm
小猪咪piggy19 小时前
【JavaEE】(9) JVM
java·jvm·java-ee
都叫我大帅哥20 小时前
Java G1垃圾收集器:从入门到调优的全面指南
java·jvm
Absinthe_苦艾酒1 天前
JVM学习专题(四)对象创建过程
java·jvm·后端
源远流长jerry1 天前
C++、STL面试题总结(二)
jvm·c++
ohoy1 天前
jvm之jconsole的使用
jvm
2301_793086871 天前
JVM 03 类加载机制
jvm
平生不喜凡桃李1 天前
Linux 线程同步与互斥
java·jvm·redis
灰原喜欢柯南1 天前
JVM(Java Virtual Machine,Java 虚拟机)超详细总结
jvm·一站式总结
-Xie-1 天前
JVM学习日记(十五)Day15——性能监控与调优(二)
java·jvm·学习