虚拟线程探索与实践
优质博文:IT-BLOG-CN
一、简介
虚拟线程是轻量级线程,极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能,并在JDK 19中发布,JDK 21中最终确定虚拟线程,以下是根据开发者反馈从JDK 20中的变化:
【1】jdk21中虚拟线程始终支持线程本地变量。与在预览版本中允许的不同,现在不再可能创建不能具有线程本地变量的虚拟线程。对线程本地变量的有保障支持确保了许多现有库可以不经修改地与虚拟线程一起使用,并有助于将以任务为导向的代码迁移到使用虚拟线程。
【2】直接使用Thread.Builder API创建的虚拟线程(而不是通过Executors.newVirtualThreadPerTaskExecutor()创建的虚拟线程)现在默认情况下也会在其生命周期内进行监控,并且可以通过描述在"观察虚拟线程"部分中的新线程转储来观察。
基于协程的线程,与其他语言中的协程有相似之处,也有不同。虚拟线程是依附于主线程的,如果主线程销毁了,虚拟线程也不复存在。
二、背景
1、大量应用时同步方式,修改成异步方式投入资源大;
2、由线程池被打满引起的事故很难杜绝,很多应用将核心和非核心的应用一起交由线程池管理;
解决上面问题有两种措施:
1、NIO:优点是有成熟框架Reactor、RxJava等。缺点是可读性欠缺,改造难度大;
2、虚拟线程:优点是业务侧改造成本低,无需池化,天然隔离。缺点是对native、synchronize方法或者外部函数不友好;
三、原理
调度方式: 当前线程将任务提交给虚拟线程的时候,是一个Runnalbe状态,存放在队列中排队。任务排到第一位后,会挂在到平台线程上Platform Thread,该线程就是用户线程New Thread的线程。当任务挂载上去之后,就是一个运载线程,执行虚拟线程中的任务。当线程执行到阻塞或者IO操作的时候,它会将当前任务卸载到队列中,重新编程Runnable状态。

状态机: 与平台的线程的状态相似,我们主要看下如下两个状态的变化
| RUNNING -> PARKING | 与普通线程一致,通常由各种block导致 | 触发后置为PARKING状态,卸载虚拟线程,调用Continuation.yield()方法 |
|---|---|---|
| RUNNING -> YIELDING | 通常为IO阻塞时 | 置为YIELDING状态,卸载虚拟线程,调用Thread.yield |

四、使用场景
计算密集型
CPU机密型: 并行开启X个任务,每个任务对5W个随机数进行排序;

结论:虚拟线程对于CPU密集型应用无优势
IO密集型
| 并发数 | CPU | 响应时间(ms) | 吞吐量 |
|---|---|---|---|
| 10 | 35 | 19 | 490 |
| 20 | 55 | 20 | 925 |
| 30 | 80 | 22 | 1296 |
| 40 | 95 | 26 | 1468 |
| 50 | 99 | 32 | 1508 |
结论:虚拟线程在CPU使用率达到80以后,性能有些许衰退。

结论: 相同的并发下
1、由于虚拟线程不需要大量的系统线程调度,节省了CPU的开销;
2、系统线程的大量减少,减少了CPU_Load排队的情况;
3、虚拟线程替换了dal的线程池,减少了线程数量(上面包含了JVM自身的线程和框架的线程);
使用案例代码:
CDubboClient instance = CDubboClient.getInstance();
FlightPassengerWS service = instance.getService(FlightPassengerWS.class);
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {StudentResponseType studentResponse = executor.submit( () -> service.getStudent(request).get());
}
五、死锁
synchronize同步代码块导致的死锁现象:

结论: 虚拟线程获取了连接后IO发生了卸载,当链接数耗尽,装载状态的虚拟线程由于拿不到链接被BLOCK,发生yield。由于在同步代码块中,yield失败发生绑定。导致其他获取链接的虚拟线程无运载线程可用。
解决办法: 使用ReentrantLock替换Synchronized
private final ReentranLock synLock = new ReentranLock();
synchronized(this) {}
// 替换为
synLock.lock();
try {} finally {synLock.unlock();
}
六、实践
QPS 1000+ 的项目性能监控
| 平台线程 | 虚拟线程 | |
|---|---|---|
| CPU使用率(avg) | 20% | 15% |
| CPU_Load(max) | 15 | 5.5 |
| 线程数(avg) | 260 | 258 |
| 时间响应(avg) | 118ms | 97ms |
| P99.9 | 3460ms | 1676ms |
使用虚拟线程后,由于切换了线程,无法从HttpContext.current()获取到任何信息,需要在虚拟线程里threadlocal重新set。
相关文章:
虚拟线程探索与实践
优质博文:IT-BLOG-CN 一、简介 虚拟线程是轻量级线程,极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能,并在JDK 19中发布,JDK 21中最终确定虚拟线程,以下是根据开发者反馈…...
openssl3.2 - 官方demo学习 - mac - poly1305.c
文章目录 openssl3.2 - 官方demo学习 - mac - poly1305.c概述笔记END openssl3.2 - 官方demo学习 - mac - poly1305.c 概述 MAC算法为Poly1305, 加密算法为AES-128-ECB, 用key初始化加密算法 加密算法进行padding填充 对加密算法的key加密, 放入MAC_key后16字节, 将MAC_key的…...
【Python 千题 —— 基础篇】不吉利的数字
题目描述 题目描述 在西方,“13”被称为不吉利的数字,这是因为耶稣与13个弟子共进晚餐时耶稣的第13个弟子出卖了耶稣,且耶稣受难的日期是13日。所以西方的门牌号会跳过13号,假设这栋楼有16户,请为这栋楼的每一户设立门牌号。 输入描述 无 输出描述 依次输出这栋楼每…...
3d模型未响应打不开怎么办---模大狮模型网
在进行3D建模和设计工作时,有时可能会遇到3D模型无法打开的情况,这给工作流程带来了困扰。本文将为您介绍一些常见的原因以及解决3D模型未响应无法打开问题的方法。 一、文件格式检查 首先,确保您使用的文件格式与所使用的软件兼容。不同的3…...
Java-NIO 开篇(1)
NIO简介 高性能的Java通信,离不开Java NIO组件,现在主流的技术框架或中间件服务器,都使用了Java NIO组件,譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前, Java IO类库是阻塞式IO&…...
VSCode 插件推荐
前言 关于开发用的插件就不做赘述了,网上面有很多文章都做了推荐,本文推荐几个好看的插件。 文件图标主题 Vscode icons Material Icon Theme 字体主题 推荐 One Dark Pro 其他 推荐一个生成好看代码的网址 https://carbon.now.sh/...
摄像部分时序
(1).,后摄像。 (2).,前摄像。 RCAM_TO_LEDDRV_STROBE_EN_CONN表面意思是:后置摄像头到led驱动闪光灯_使能。从时序图中看起来是连接到U17的,发现果然如此。 闪光灯温度检测,是检测闪光灯的温度。所以时序图…...
为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据
文章目录 Slice vs Map:基本概念内存分配和性能Fasthttp 中的 SliceMap性能优化的深层原因HTTP Headers 的特性CPU 预加载特性 结论 Fasthttp 是一个高性能的 Golang HTTP 框架,它在设计上做了许多优化以提高性能。其中一个显著的设计选择是使用 slice 而…...
C#设计模式教程(7):适配器模式
适配器模式的定义 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间能够相互合作。适配器的作用是解决那些因接口不兼容而不能一起工作的类的问题,它通过包装一个类的接口转换成另一个期望的接口。 适配器模式主要分为两种: 类适配器(Class Ad…...
1818:红与黑【解析】-------深度优先搜索
1818:红与黑 描述 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 输入 包括多个数据集合。每个数据集合的第一行…...
实验三 Oracle数据库的创建和管理
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…...
Mysql:重点且常用的 SQL 标签整理
目录 1 <resultMap> 标签 2 <sql> 标签 3 <where> 标签 4 <if> 标签 5 <trim> 标签 6 <foreach> 标签 7 <set> 标签 1 <resultMap> 标签 比如以下代码: <resultMap type"SysCollege" id&qu…...
云锁防火墙编译安装nginx-plugin模块
一般情况下,当用户安装云锁的时候,云锁会自动适配nginx版本,使用我们已经预编译好的包含云锁模块的nginx备份并替换掉您当前系统中使用的nginx。卸载时,会将系统原始nginx文件替换回来。因此,云锁可保护使用nginx搭建的…...
【服务器数据恢复】服务器迁移数据时lun数据丢失的数据恢复案例
服务器数据恢复环境&服务器故障: 一台安装Windows操作系统的服务器。工作人员在迁移该服务器中数据时突然无法读取数据,服务器管理界面出现报错。经过检查发现服务器中一个lun的数据丢失。 服务器数据恢复过程: 1、将故障服务器中所有磁盘…...
6.4.2转换文件
6.4.2转换文件 利用Swf2VideoConverter2可以很方便地将Flash动画(*.swf)转换为其它的视频格式。 1.单击“添加”按钮,在弹出的下拉菜单中选择“添加文件”,在弹出的“Open Swf Files(打开Swf文件)”窗口中选择swf文件(如:那些花…...
智能驾驶新浪潮:SSD与UFS存储技术如何破浪前行?-UFS篇
如果说SSD是赛道上的超级跑车,那UFS更像是专为智能汽车定制的高性能轻量化赛车。UFS采用串行接口技术,像是闪电侠一样,将数据传输的速度推向新高,大幅缩短了系统启动时间和应用程序加载时间,这对追求即时反应的ADAS系统…...
TS 学习笔录(持续更新中)
TS学习笔录 1、TS 数据类型有哪些?2、元组是什么?3、union(联合类型)& Literal(字面量类型)?4、any 和 unknown 的区别?5、Object 对象类型?6、type 、interface 、 class 之间…...
RabbitMQ安装和使用
简介 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一个Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成。所有主要的编程语言均有与代理接口通讯的客户端库…...
使用pyechart创建折线图
import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…...
Vue3+Ts:使用i18n实现国际化与全局动态下拉框框切换语言
Vue3Ts:使用i18n实现国际化与全局动态下拉框框切换语言 一、下载依赖:二、创建ts文件并配置main.ts三,如何使用1.在<template>中使用2.在setup中使用 四、全局下拉框动态切换 一、下载依赖: npm install vue-i18nnex二、创…...
超厉害!AI写教材,低查重且内容连贯,快速产出专业教材!
整理教材知识点实在是一项“精细工作”,最大的挑战在于如何保持平衡与衔接!我们常常担忧会遗漏核心概念,或是难以掌握合适的难度梯度——小学教材常常写得过于复杂,导致学生难以理解;而高中教材则可能显得过于简单&…...
Chrome二维码插件:跨设备链接传输的智能解决方案
Chrome二维码插件:跨设备链接传输的智能解决方案 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件,用于生成当前URL或者选中内容的二维码,同…...
AI不可靠性工程指南:从失效机理到五层防护网
1. 这不是一句抱怨,而是一条必须写进操作手册的警告 “AI Is Unreliable”——当我在第三个项目里连续两次被同一个大模型生成的Python函数在边界条件下 silently 返回 None 而不是抛出异常、导致下游数据管道静默丢失23%的样本后,我把这句话钉在了团队共…...
2026年腾讯云OpenClaw/Hermes Agent配置Token Plan搭建保姆教程
2026年腾讯云OpenClaw/Hermes Agent配置Token Plan搭建保姆教程。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...
破解Windows安装程序本地化难题:Inno Setup简体中文翻译的技术实现与架构设计
破解Windows安装程序本地化难题:Inno Setup简体中文翻译的技术实现与架构设计 【免费下载链接】Inno-Setup-Chinese-Simplified-Translation :earth_asia: Inno Setup Chinese Simplified Translation 项目地址: https://gitcode.com/gh_mirrors/in/Inno-Setup-Ch…...
uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程
uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程 【免费下载链接】uView2.0 uView UI,是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 项目地址: https://gitcode.com/gh_mirrors/…...
抖音视频批量下载工具:免费保存去水印内容完整指南
抖音视频批量下载工具:免费保存去水印内容完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...
终极微信聊天记录导出指南:用WeChatExporter彻底掌控你的数据主权
终极微信聊天记录导出指南:用WeChatExporter彻底掌控你的数据主权 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字时代,微信聊天记录承载着…...
Wireshark提取NTLMv2 Hash与Hashcat强度验证实战
1. 这不是“黑客教程”,而是一次企业内网安全加固前的必做体检Wireshark抓NTLMv2 Hash、Hashcat暴力破解——看到这两个词,很多人第一反应是“红队操作”或“渗透测试”。但在我过去十年服务的三十多家中大型企业客户里,真正驱动这个动作的&a…...
如何用AI瞄准技术实现职业级游戏体验:从零开始的完整配置指南
如何用AI瞄准技术实现职业级游戏体验:从零开始的完整配置指南 【免费下载链接】yolov8_aimbot Aim-bot based on AI for all FPS games 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_aimbot 你是否曾在FPS游戏中因瞄准不稳而错失关键击杀?…...
