当前位置: 首页 > news >正文

JDK21-虚拟线程(原理)

一、先给结论

虚拟线程不是不运行在 OS 线程上,而是:
只在“真正需要 CPU 时”才短暂占用 OS 线程。
在 IO 等待时,JVM 会把它“卸载”下来。


二、为什么传统线程一定占用 OS 线程?

1️⃣ Java 线程 = OS 线程(1:1)

在 Java 21 之前:

JavaThread<==>OSThread

当你写:

Threadt=newThread(()->httpCall());t.start();

本质是:

  • JVM 调用pthread_create
  • 创建一个真实的内核线程
  • 栈、调度、阻塞全交给操作系统

2️⃣ OS 不懂“这是 IO 等待”

当线程调用:

socket.read();

操作系统只知道一件事:

“这个线程现在在等数据”

于是:

  • OS 把线程状态设为BLOCKED
  • 线程仍然存在
  • 仍然占:
    • 内核线程结构
    • 栈内存
    • 调度成本

📌OS 无法把这个线程“拆掉”再给别人用


三、虚拟线程是如何“骗过”操作系统的?

关键思想:

👉阻塞不交给 OS,而是交给 JVM


1️⃣ 虚拟线程的真实结构

Virtual Thread(JVM对象) | |--- Continuation(可挂起的执行体) | |--- 运行在 ↓ Carrier Thread(少量 OS 线程)

Carrier Thread 才是真正的 OS 线程


2️⃣ JVM 在关键 IO 点“插手”了

虚拟线程的核心魔法在这里👇

传统线程:

Thread | |-- socket.read() | |-- OS 阻塞线程

虚拟线程:

VirtualThread | |-- socket.read() | |-- JVM 拦截 | |-- 保存当前执行现场(Continuation) |-- 从 Carrier Thread 上卸载 |-- 把 Carrier Thread 还给调度器

📌OS 完全不知道有这么回事


3️⃣ JVM 怎么知道“这是 IO”?

因为:

👉 JDK 的 IO 被“改造”了(关键)

以下 API 在虚拟线程下是可挂起的

  • Socket
  • HttpClient
  • InputStream / OutputStream
  • Selector
  • NIO

JDK 内部逻辑(简化):

if(currentThread.isVirtual()){parkContinuation();}else{blockOSThread();}

四、Continuation:真正的“黑科技”

1️⃣ 什么是 Continuation?

你可以理解为:

一个可以暂停 / 恢复的调用栈快照

它保存了:

  • 当前方法栈
  • 局部变量
  • 执行位置

2️⃣ 挂起时发生了什么?

┌──────────────┐ │ 方法 A │ │ 方法 B │ │ 方法 C <-- 当前执行点 └──────────────┘

JVM 做了:

  1. 把这段执行栈复制到堆内存
  2. 解绑当前 OS 线程
  3. 标记为 WAITING

3️⃣ 恢复时发生了什么?

当 IO 就绪:

  1. JVM 选一个空闲 Carrier Thread
  2. 把 Continuation 装回去
  3. 从 C 方法继续执行

👉就像什么都没发生过


五、为什么说“虚拟线程不占用 OS 线程”?

更准确的说法是:

**虚拟线程在“运行时”才占用 OS 线程
**在“等待时”不占用 OS 线程

对比:

状态传统线程虚拟线程
执行 CPU占 OS 线程占 OS 线程
等 IO仍占 OS 线程❌ 不占
空闲不占

六、这就是为什么并发能暴涨 100 倍

假设:

  • OS 线程池:200
  • IO 等待时间:95%

传统模型:

200 个线程 ≈ 190 个在等 IO ≈ 10 个在干活

虚拟线程模型:

200 个 Carrier Thread + 100,000 个 Virtual Thread ≈ 99,500 个在挂起 ≈ 500 个随时可运行

七、为什么你“几乎不用改代码”?

因为:

  • 同步 API 没变
  • try/catch 没变
  • ThreadLocal 可用
  • JDBC / HTTPClient 可用

JVM在你看不到的地方做了调度革命。

http://www.jsqmd.com/news/284902/

相关文章:

  • USACO历年白银组真题解析 | 2005年2月
  • 2026英语雅思培训机构辅导机构怎么选?深度解析行业现状+优质机构口碑榜单与家长择校指南
  • 2026英语雅思培训学校机构辅导机构推荐哪家好?家长择校避坑指南+深度解析
  • 2026年上海全屋定制衣柜公司TOP品牌厂家排行榜:全屋定制行业深度评测与排名、行业问题与选择指南
  • rust maturin 在调用 cargo 时,无法联网拉取 crates.io 索引,因为系统被代理到 127.0.0.1:10809,而本地并没有可用的代理服务
  • JDK21-虚拟线程(实战)
  • AI Agent架构全解析:从感知到行动,小白也能上手的智能体开发实战,错过再等十年!
  • 【AI黑科技】颠覆传统RAG!PageIndex让AI拥有“推理脑“,金融文档分析准确率98.7%!
  • 大模型Agent Skills配置指南:让AI助手从“智障“变“神助攻“,附销售数据分析实战代码
  • 【学术干货免费领】学术会议海报 | 学术会议必备 | 科研展示 | 科研海报 | 国际学术海报 | 会议参会 | 科研成果展示 | 海报展示 | 90+学术Poster模板0元打包下载,速领!
  • 震惊!90%的RAG项目都做错了!RAG不是“加模块“,而是构建完整的AI判断体系
  • 【大模型实战】Agent开发不再迷茫:从推理到运行,构建能“活下去“的系统
  • 【广州南方学院主办 | 斯普林格出版 | 高录用、接收综述文章 | 征稿主题广:人工智能、虚拟现实、艺术、设计类稿件均可接收】第二届人工智能赋能数字创意设计国际学术会议(AIEDCD 2026)
  • 【AI炸裂】大模型Agent学习指南:131篇顶会论文+321个实战案例+代码,小白也能弯道超车!
  • 移动端测试如何学,超详细的APP测试攻略送上
  • 【大数据毕设全套源码+文档】基于Hadoop和Hive的济南旅游景区数据的分析与可视化的设计与实现(丰富项目+远程调试+讲解+定制)
  • 【AI革命】马斯克X算法大揭秘:人工规则已死,RAG接管一切!程序员必学的顶级架构!
  • 【大数据毕设源码分享】django基于大数据的共享单车数据分析与可视化的设计与实现(程序+文档+代码讲解+一条龙定制)
  • TGF-β 信号通路核心干货解析
  • AI Agent‘翻车‘别慌!Skills来救场,小白也能当大神!
  • 腾讯技术面:数据库核心八股终极典藏版
  • 【大数据毕设源码分享】springboot基于Hadoop和Hive的济南旅游景区数据的分析与可视化的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 【保姆级教程】AI Agent编排新姿势:TurnToken机制让大模型协作像搭积木一样简单!
  • 多模态RAG真香!一文带你掌握AI开发的最新技术趋势,小白也能秒懂的编程干货!
  • 【大数据毕设源码分享】基于django的IT行业招聘数据分析与岗位推荐系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 【大数据毕设全套源码+文档】基于Django的IT行业招聘数据分析与岗位推荐系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 「干货合集」NF-κB 信号通路:核心机制、功能与科研应用全解析
  • 篡改微信余额技术可刑性研讨 2.0
  • 【大数据毕设源码分享】基于Python的农业大数据管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • [Windows] 下载管理工具 AB Download Manager v1.8.4