登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
安全
›
Java虚拟线程实战:Project Loom让并发编程更简单 ...
Java虚拟线程实战:Project Loom让并发编程更简单
[ 复制链接 ]
缑娅瑛
4 天前
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
前言
Java 21 正式引入虚拟线程(Virtual Threads),这是 Project Loom 的核心成果。虚拟线程让 Java 并发编程从"难"变"简",彻底改变了高并发应用的开发方式。本文带你全面掌握虚拟线程。
一、虚拟线程 vs 平台线程
平台线程
:对应操作系统线程,创建成本高(约1MB栈内存),数量受限
虚拟线程
:JVM 管理的轻量级线程,创建成本极低(约几KB),可创建数百万个
// 平台线程:创建100万个会OOM
Thread platformThread = new Thread(() -> doWork());
platformThread.start();
// 虚拟线程:创建100万个轻松搞定
Thread virtualThread = Thread.ofVirtual().start(() -> doWork());
复制代码
二、创建虚拟线程的四种方式
// 方式1:Thread.ofVirtual()
Thread vt1 = Thread.ofVirtual().name("vt-1").start(() -> {
System.out.println("Virtual thread: " + Thread.currentThread());
});
// 方式2:Thread.startVirtualThread()
Thread vt2 = Thread.startVirtualThread(() -> {
System.out.println("Running in virtual thread");
});
// 方式3:虚拟线程 ExecutorService
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> processRequest());
executor.submit(() -> processRequest());
}
// 方式4:ThreadFactory
ThreadFactory factory = Thread.ofVirtual().factory();
Thread vt4 = factory.newThread(() -> doWork());
vt4.start();
复制代码
三、实战:高并发 HTTP 请求处理
// 传统方式:线程池,受限于线程数
ExecutorService threadPool = Executors.newFixedThreadPool(200);
// 虚拟线程方式:每个请求一个虚拟线程
@RestController
public class UserController {
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
// 虚拟线程会在 I/O 阻塞时自动挂起,释放载体线程
return userService.findById(id); // 数据库查询
}
}
// Spring Boot 3.2+ 开启虚拟线程
// application.yml
// spring:
// threads:
// virtual:
// enabled: true
复制代码
四、性能对比测试
public class PerformanceTest {
// 模拟 I/O 密集型任务
static void ioTask() throws InterruptedException {
Thread.sleep(100); // 模拟数据库查询
}
public static void main(String[] args) throws Exception {
int taskCount = 10_000;
// 平台线程池
long start1 = System.currentTimeMillis();
try (ExecutorService pool = Executors.newFixedThreadPool(200)) {
List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < taskCount; i++) {
futures.add(pool.submit(() -> { ioTask(); return null; }));
}
for (Future<?> f : futures) f.get();
}
System.out.println("Platform threads: " + (System.currentTimeMillis() - start1) + "ms");
// 输出约:5200ms
// 虚拟线程
long start2 = System.currentTimeMillis();
try (ExecutorService vExecutor = Executors.newVirtualThreadPerTaskExecutor()) {
List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < taskCount; i++) {
futures.add(vExecutor.submit(() -> { ioTask(); return null; }));
}
for (Future<?> f : futures) f.get();
}
System.out.println("Virtual threads: " + (System.currentTimeMillis() - start2) + "ms");
// 输出约:120ms,提升40倍!
}
}
复制代码
五、注意事项
避免 synchronized 块
:会导致虚拟线程固定(pinning),改用 ReentrantLock
不适合 CPU 密集型任务
:虚拟线程优势在 I/O 密集型场景
ThreadLocal 谨慎使用
:大量虚拟线程时内存占用可能增加
// 错误:synchronized 导致 pinning
synchronized (lock) {
Thread.sleep(100); // 虚拟线程被固定,无法挂起
}
// 正确:使用 ReentrantLock
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
Thread.sleep(100); // 虚拟线程可以正常挂起
} finally {
lock.unlock();
}
复制代码
总结
虚拟线程是 Java 并发编程的重大突破,特别适合 I/O 密集型的微服务场景。升级到 Java 21 + Spring Boot 3.2,一行配置即可享受虚拟线程带来的性能提升。
觉得有帮助请点赞收藏!有问题欢迎评论区交流
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
Java
虚拟
线程
实战
Project
相关帖子
OpenFeign实战:Spring Cloud微服务间优雅调用指南
OpenFeign实战:Spring Cloud微服务间优雅调用指南
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
OpenFeign实战:Spring Cloud微服务间优雅调用指南
0
553
怃膝镁
2026-04-07
安全
OpenFeign实战:Spring Cloud微服务间优雅调用指南
0
893
师悠逸
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
422
国语诗
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
205
悯拄等
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
540
森萌黠
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
468
孟茹云
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
499
纣捎牟
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
55
能拘
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
345
赘暨逢
2026-04-07
业界
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
0
686
拓拔梨婷
2026-04-07
回复
(2)
晁红叶
3 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
喜欢鼓捣这些软件,现在用得少,谢谢分享!
伯斌
前天 23:05
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
缑娅瑛
前天 23:05
关注
0
粉丝关注
16
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991126
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
神泱
9516
6
宋子
9876
7
韶又彤
9909
8
荪俗
8989
9
蓬森莉
9868
10
俞瑛瑶
10000
查看更多
今日好文热榜
69
《DNESP32P4开发指南_V1.0》第十四章 UART
543
《DNESP32P4开发指南_V1.0》第十四章 UART
769
上周热点回顾(3.30-4.5)
816
avalonia在国产芯片瑞芯微RK3588这么容易就
476
可视化运维!一款桌面级 AI 运维系统!
120
可视化运维!一款桌面级 AI 运维系统!
485
上周热点回顾(3.30-4.5)
684
FastAPI + Vue 前后端分离实战:我的项目结
53
FastAPI + Vue 前后端分离实战:我的项目结
162
《DNESP32P4开发指南_V1.0》第十四章 UART
413
《DNESP32P4开发指南_V1.0》第十四章 UART
203
FastAPI + Vue 前后端分离实战:我的项目结
777
网关实现钢铁厂DLT645电表数据接入西门子PL
343
FastAPI + Vue 前后端分离实战:我的项目结
420
FastAPI + Vue 前后端分离实战:我的项目结
538
FastAPI + Vue 前后端分离实战:我的项目结
319
手撕 Transformer (5):模型构建
466
FastAPI + Vue 前后端分离实战:我的项目结
172
网关实现钢铁厂DLT645电表数据接入西门子PL
497
FastAPI + Vue 前后端分离实战:我的项目结