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

JDK17-21特性Virtual-Threads详解

Virtual Threads 详解

一、知识概述

Virtual Threads(虚拟线程)是 Java 21 引入的重大特性,它是 Project Loom 项目的核心成果。虚拟线程是一种轻量级的线程实现,由 JVM 而非操作系统管理,可以极大地提高并发程序的可扩展性。

1.1 传统线程的局限性

在虚拟线程出现之前,Java 的线程是与操作系统线程一一对应的:

Java Thread (Platform Thread) ←→ OS Thread

这种映射方式存在以下问题:

  1. 资源消耗大:每个 OS 线程占用约 1MB 栈空间
  2. 创建成本高:创建线程需要系统调用
  3. 数量受限:一台服务器通常只能创建几千个线程
  4. 上下文切换开销:OS 级别的线程切换成本高

1.2 虚拟线程的解决方案

虚拟线程采用 M:N 的调度模型:

多个 Virtual Thread (M) ←→ 少量 Carrier Thread (N) ←→ OS Thread (N)

优势:

  • 轻量级:每个虚拟线程只占用几百字节
  • 数量不限:可以创建数百万个虚拟线程
  • 高效调度:JVM 级别的调度,切换成本低
  • 简化编程:使用传统同步编程模型实现高并发

二、知识点详细讲解

2.1 虚拟线程基础

2.1.1 创建虚拟线程
importjava.util.concurrent.Executors;importjava.util.concurrent.ThreadFactory;publicclassVirtualThreadCreation{publicstaticvoidmain(String[]args)throwsException{// 方式1:使用 Thread.startVirtualThread()ThreadvThread1=Thread.startVirtualThread(()->{System.out.println("Hello from virtual thread: "+Thread.currentThread());});vThread1.join();// 方式2:使用 Thread.BuilderThreadvThread2=Thread.ofVirtual().name("my-virtual-thread").unstarted(()->System.out.println("Using Thread.Builder"));vThread2.start();vThread2.join();// 方式3:使用 Executors.newVirtualThreadPerTaskExecutor()try(varexecutor=Executors.newVirtualThreadPerTaskExecutor()){executor.submit(()->System.out.println("From executor"));}// 方式4:使用 ThreadFactoryThreadFactoryfactory=Thread.ofVirtual().factory();ThreadvThread3=factory.newThread(()->{System.out.println("Created by factory");});vThread3.start();vThread3.join();// 判断是否为虚拟线程System.out.println("Is virtual: "+Thread.currentThread().isVirtual());}}
2.1.2 虚拟线程与平台线程对比
publicclassThreadComparison{publicstaticvoidmain(String[]args){// 平台线程ThreadplatformThread=Thread.ofPlatform().name("platform-thread").unstarted(()->{System.out.println("Platform thread: "+Thread.currentThread());System.out.println("Is virtual: "+Thread.currentThread().isVirtual());});// 虚拟线程ThreadvirtualThread=Thread.ofVirtual().name("virtual-thread").unstarted(()->{System.out.println("Virtual thread: "+Thread.currentThread());System.out.println("Is virtual: "+Thread.currentThread().isVirtual());});platformThread.start();virtualThread.start();// 查看线程属性System.out.println("\n平台线程属性:");System.out.println(" 栈大小: "+platformThread.getStackTrace().length);System.out.println("\n虚拟线程属性:");System.out.println(" 是否虚拟: "+virtualThread.isVirtual());}}

2.2 虚拟线程调度

2.2.1 调度原理
importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassVirtualThreadScheduling{publicstaticvoidmain(String[]args)throwsException{// 查看载波线程(Carrier Thread)System.out.println("Available processors: "+Runtime.getRuntime().availableProcessors());// 创建多个虚拟线程,观察调度try(ExecutorServiceexecutor=Executors.newVirtualThreadPerTaskExecutor()){for(inti=0;i<10;i++){inttaskId=i;executor.submit(()->{StringthreadName=Thread.currentThread().getName();System.out.println("Task "+taskId+" running on: "+threadName);// 模拟阻塞操作try{Thread.sleep(100);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}System.out.println("Task "+taskId+" completed");});}}}}
2.2.2 固定载波线程数
importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.ThreadFactory;publicclassCustomCarrierThreads{publicstaticvoidmain(String[]args){// 默认情况下,载波线程数等于 CPU 核心数// 可以通过系统属性调整System.setProperty("jdk.virtualThreadScheduler.parallelism","4");System.setProperty("jdk.virtualThreadScheduler.maxPoolSize","8");try(ExecutorServiceexecutor=Executors.newVirtualThreadPerTaskExecutor()){for(inti=0;i<20;i++){intid=i;executor.submit(()->{System.out.println("Task "+id+": "+Thread.currentThread());try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}});}}}}

2.3 阻塞操作与挂载/卸载

2.3.1 阻塞操作的自动挂载
importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.concurrent.Executors;publicclassBlockingOperationsDemo{publicstaticvoidmain(String[]args)throwsException{// 启动一个简单的服务器try(ServerSocketserverSocket=newServerSocket(8080);varexecutor=Executors.newVirtualThreadPerTaskExecutor())
http://www.jsqmd.com/news/712014/

相关文章:

  • 革命性密钥管理平台Infisical:一站式解决企业级密钥安全难题
  • 2026年制氮机公司推荐:恒大净化领衔,防爆制氮机厂家/PSA制氮机厂家/食品制氮机厂家汇总,为你解答制氮机哪家好 - 栗子测评
  • Graphormer效果可视化:property-guided任务输出解读与置信度分析
  • 必藏!强网杯十年进化史:从解题到实战的网安进阶攻略
  • Qwen3.5-2B入门指南:Clear Chat与Export History在团队协作中的妙用
  • Austin实战:Web应用性能分析与优化案例
  • ETASOLUTIONS钰泰 ETA9740E8A ESOP8 电池管理
  • 汽车电子虚拟原型技术:开发效率与安全验证的革命
  • 我的文章喂喂喂
  • 2026年兰州钢结构库房厂家TOP5推荐:彩钢、彩钢厂、兰州场结构安装、兰州工字钢、兰州异性钢结构、兰州彩钢加工厂选择指南 - 优质品牌商家
  • TVA在汽车动力电池模组全流程检测中的应用(9)
  • VS Code Copilot Next 真实生产部署失败复盘:3家头部科技公司血泪教训,第2条99%开发者仍在踩坑
  • PowerShell高效查询Azure ZeroGPU云资源实例
  • 低代码平台对接进入“MCP 2026时代”,这9个必须重写的扩展点你改对了吗?
  • ARM内存管理:TCR与TCRMASK寄存器详解
  • GitHub1s代码折叠终极指南:快速掌握大型代码文件浏览技巧
  • JDK17-21特性Pattern-Matching详解
  • 【C语言嵌入式RTOS开发黄金标准】:2026版官方规范首次解禁,97%工程师尚未掌握的5大硬核约束条件
  • 如何用 Viewer.js 打造完美的图像查看体验:新手快速上手指南
  • Flutter for OpenHarmony跨平台技术
  • RoPE旋转位置编码:原理、实现与NLP应用实践
  • ConceptMoE架构:动态语义压缩优化大规模语言模型
  • 040、未来展望:自主智能体、AGI与架构新范式
  • 【VS Code Copilot Next 生产级工作流配置指南】:20年DevOps专家亲授自动化部署避坑清单(含3大高危配置雷区)
  • 2026年工业门厂家排行:兰州工业门/兰州快速卷帘门/兰州快速门/兰州感应门/兰州抗风卷帘门/兰州柔性大门/兰州水晶卷帘门/选择指南 - 优质品牌商家
  • 跨平台技术
  • 大型语言模型编辑技术:CrispEdit原理与应用
  • VSCode/Trae使用Codex插件接入第三方中转API使用GPT-5.4的图文教程 VSCode Codex、GPT-5.4 API接入、Codex第三方API配置、Trae Codex教程
  • PvZ Toolkit:内存注入技术与游戏逆向工程的完美融合
  • svn2git部署指南:在Linux系统上安装和配置的完整流程