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

Java虚拟线程实战:Project Loom让并发编程更简单

一、虚拟线程 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倍! } }

回到顶部

五、注意事项

  1. 避免 synchronized 块:会导致虚拟线程固定(pinning),改用 ReentrantLock
  2. 不适合 CPU 密集型任务:虚拟线程优势在 I/O 密集型场景
  3. 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 密集型的微服务场景。

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

相关文章:

  • 厨房电热水器出海:初创品牌如何用轻量化海外客服破解复杂售后难题
  • AI伦理与算法偏见:从概念到工程化治理实践
  • 针对测试的AIAgent开发
  • 【EI会议】智能交通系统与自动化控制方向
  • 自动化测试——让代码“自我验证“
  • 普通职场人用 Hermes Agent 能干啥?
  • 功能划分阿里云开源的terway代码有三部分
  • Dify 接入 Claude API 完全配置指南:从选型到生产部署开篇:三种接入方案快速决策表
  • 智谱GLM-5.2开源引发安全警报,无审查限制具备仓库级漏洞挖掘能力
  • Three.js 残影效果教程
  • GB/T 7714参考文献排版解决方案深度解析:企业级学术出版架构设计与最佳实践
  • 场外衍生品的详细解读:从产品结构到业务流程,一文看懂核心逻辑
  • 使用PHP对接韩国股票市场API 实时数据、IPO和K线(Kline)的PHP对接方案
  • 2026智能门锁硬核横评:安全、AI与售后全维度大解密,谁才是真正的“看门神”?
  • 深度拆解维普露禾AI教科研平台:学术知识图谱+大模型如何破解教育场景AI幻觉问题
  • 共同关心的话题进行了建设性交流
  • 基于 RFID 的企业固定资产全生命周期数字化管控技术方案
  • PIC18LF4620驱动WS2812 LED灯带的嵌入式开发实践
  • 每个人的遗忘程度都不一样,建议第二天复习前一天的内容,
  • 《TCP 客户端代码逐行寻宝:三次握手、死循环 close 的谜底全拆解》
  • Java中String.valueOf(null)的惊天大坑:对比两个数时,日志打印的两数都是null,但Objects.equals()返回false!
  • 拆解大健康爆火七人拼团,P1 到 P10 晋升逻辑全曝光
  • 房颤史患者用匹妥布替尼Pirtobrutinib,出血风险比伊布替尼低吗
  • AI大模型面试高频题:20道API工程化考点详解
  • 最初的需求
  • GPU内核融合技术:性能优化原理与实践
  • 计算机毕业设计之基于弹幕文本大数据的情感分析与可视化
  • 计算机毕业设计之基于大数据技术的新能源汽车销售数据可视化平台设计与实现
  • 【课程设计/毕业设计】基于 Java 的高中生多元素质评价管理系统的设计与实现【附源码、数据库、万字文档】
  • 低门槛股票量化工具横评:回测盯盘风控和条件单怎么分工