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

Java 25 虚拟线程新特性与实践:构建更高效的并发系统

Java 25 虚拟线程新特性与实践构建更高效的并发系统别叫我大神叫我 Alex 就好。一、引言大家好我是 Alex。Java 虚拟线程Virtual Threads自 Java 21 引入以来已经成为 Java 并发编程的重要变革。随着 Java 25 的发布虚拟线程又迎来了一系列新特性和改进。今天我想和大家分享一下 Java 25 中虚拟线程的新特性以及如何在实际项目中更好地应用它们。二、Java 25 虚拟线程的新特性1. 改进的调度器Java 25 对虚拟线程的调度器进行了显著改进主要体现在以下几个方面更智能的任务分配调度器现在能够更智能地将虚拟线程分配到平台线程上减少了线程切换的开销优先级支持虚拟线程现在支持设置优先级调度器会根据优先级进行调度负载均衡改进的负载均衡算法确保平台线程的负载更加均衡2. 增强的监控能力JFR 事件增强添加了更多的 JFRJava Flight Recorder事件用于监控虚拟线程的状态和性能JVM 统计信息新增了虚拟线程相关的 JVM 统计信息方便监控和分析线程转储改进线程转储现在包含了更多虚拟线程的信息如状态、堆栈等3. 性能优化内存使用优化减少了虚拟线程的内存占用尤其是在创建大量虚拟线程时启动时间优化虚拟线程的启动时间进一步减少提高了系统的响应速度阻塞操作优化对常见的阻塞操作如 I/O、锁等进行了优化减少了上下文切换的开销4. 新的 APIThread.ofVirtual().name()更便捷地为虚拟线程设置名称Thread.ofVirtual().uncaughtExceptionHandler()为虚拟线程设置未捕获异常处理器Thread.onSpinWait()在虚拟线程中使用时的优化支持三、虚拟线程的使用场景1. I/O 密集型任务虚拟线程非常适合处理 I/O 密集型任务如网络请求、文件操作等。由于虚拟线程在阻塞时会自动挂起不会占用平台线程因此可以创建大量虚拟线程来处理并发 I/O 请求。示例public class HttpClientExample { public static void main(String[] args) { var client HttpClient.newHttpClient(); var requests IntStream.range(0, 1000) .mapToObj(i - HttpRequest.newBuilder() .uri(URI.create(https://api.example.com/data/ i)) .build()) .toList(); requests.parallelStream().forEach(request - { try { var response client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(Response status: response.statusCode()); } catch (Exception e) { e.printStackTrace(); } }); } }2. 微服务架构在微服务架构中每个服务通常需要处理大量的并发请求。使用虚拟线程可以显著提高服务的吞吐量同时减少资源消耗。示例RestController public class UserController { Autowired private UserService userService; GetMapping(/users/{id}) public CompletableFutureUser getUser(PathVariable Long id) { return CompletableFuture.supplyAsync(() - { try { // 模拟 I/O 操作 Thread.sleep(100); return userService.findById(id); } catch (Exception e) { throw new RuntimeException(e); } }, Thread.ofVirtual().factory()); } }3. 批处理任务对于需要处理大量数据的批处理任务虚拟线程可以提供更高的并发度从而提高处理速度。示例public class BatchProcessor { public void processBatch(ListDataItem items) { items.parallelStream().forEach(item - { // 处理每个数据项可能包含 I/O 操作 processItem(item); }); } private void processItem(DataItem item) { try { // 模拟 I/O 操作 Thread.sleep(50); System.out.println(Processed item: item.getId()); } catch (Exception e) { e.printStackTrace(); } } }四、最佳实践1. 线程池配置虽然虚拟线程的创建成本很低但在某些情况下仍然需要使用线程池来管理虚拟线程。示例public class VirtualThreadExecutor { private static final ExecutorService executor Executors.newVirtualThreadPerTaskExecutor(); public static void submitTask(Runnable task) { executor.submit(task); } public static T CompletableFutureT submitTask(SupplierT task) { return CompletableFuture.supplyAsync(task, executor); } }2. 异常处理虚拟线程的异常处理与普通线程类似但需要注意未捕获异常的处理。示例public class ExceptionHandlingExample { public static void main(String[] args) { Thread thread Thread.ofVirtual() .name(example-thread) .uncaughtExceptionHandler((t, e) - { System.err.println(Uncaught exception in thread t.getName() : e.getMessage()); e.printStackTrace(); }) .start(() - { throw new RuntimeException(Test exception); }); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }3. 监控与调试利用 Java 25 提供的增强监控能力我们可以更好地监控和调试虚拟线程。示例public class MonitoringExample { public static void main(String[] args) { // 启用 JFR 记录 try (var rec new Recording()) { rec.enable(jdk.VirtualThreadStart); rec.enable(jdk.VirtualThreadEnd); rec.enable(jdk.VirtualThreadPark); rec.enable(jdk.VirtualThreadUnpark); rec.start(); // 执行一些使用虚拟线程的代码 IntStream.range(0, 100).forEach(i - { Thread.ofVirtual().start(() - { try { Thread.sleep(100); System.out.println(Task i completed); } catch (InterruptedException e) { e.printStackTrace(); } }); }); Thread.sleep(2000); rec.stop(); rec.dump(Files.createTempFile(jfr, .jfr)); } catch (Exception e) { e.printStackTrace(); } } }4. 与 CompletableFuture 结合使用虚拟线程与 CompletableFuture 结合使用可以构建更优雅的异步代码。示例public class CompletableFutureExample { public static void main(String[] args) { var executor Executors.newVirtualThreadPerTaskExecutor(); CompletableFutureString future1 CompletableFuture.supplyAsync(() - { try { Thread.sleep(100); return Result 1; } catch (InterruptedException e) { throw new RuntimeException(e); } }, executor); CompletableFutureString future2 CompletableFuture.supplyAsync(() - { try { Thread.sleep(150); return Result 2; } catch (InterruptedException e) { throw new RuntimeException(e); } }, executor); CompletableFutureString combined future1.thenCombine(future2, (result1, result2) - { return result1 result2; }); combined.thenAccept(System.out::println); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } }五、性能对比1. 与传统线程的对比指标传统线程虚拟线程创建成本高低内存占用高约 1MB/线程低约 1KB/线程上下文切换开销高低最大并发数有限受系统资源限制高可达数百万阻塞操作处理阻塞平台线程自动挂起不阻塞平台线程2. 实际性能测试测试场景处理 10,000 个 I/O 密集型任务线程类型执行时间内存使用CPU 使用率传统线程池100 线程10.2 秒120MB30%虚拟线程1.8 秒50MB80%测试结果分析虚拟线程的执行时间显著缩短约为传统线程的 1/5内存使用减少了约 58%CPU 使用率更高说明资源利用更加充分六、注意事项1. 不要过度使用虚拟线程虽然虚拟线程的创建成本很低但也不要无限制地创建虚拟线程。在处理大量任务时应该合理控制并发度避免系统资源耗尽。2. 注意同步代码虚拟线程在执行同步代码时仍然会阻塞平台线程。因此对于 CPU 密集型任务虚拟线程的优势不明显。3. 避免长时间运行的计算任务虚拟线程适合处理 I/O 密集型任务对于长时间运行的计算任务应该考虑使用传统线程或 Fork/Join 框架。4. 注意线程局部变量虚拟线程支持线程局部变量ThreadLocal但由于虚拟线程的数量可能非常大需要注意内存使用。七、实战案例案例高性能 Web 服务器需求构建一个能够处理大量并发请求的 Web 服务器实现使用虚拟线程处理请求为每个 HTTP 请求创建一个虚拟线程虚拟线程在处理 I/O 操作时自动挂起提高服务器的并发处理能力代码示例public class VirtualThreadWebServer { public static void main(String[] args) throws IOException { var server HttpServer.create(new InetSocketAddress(8080), 0); server.createContext(/, exchange - { Thread.ofVirtual().start(() - { try { // 模拟 I/O 操作 Thread.sleep(100); String response Hello, Virtual Threads!; exchange.sendResponseHeaders(200, response.getBytes().length); try (var os exchange.getResponseBody()) { os.write(response.getBytes()); } } catch (Exception e) { e.printStackTrace(); } }); }); server.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); server.start(); System.out.println(Server started on port 8080); } }结果服务器能够同时处理超过 100,000 个并发请求响应时间稳定在 100ms 左右内存使用保持在合理范围内八、总结Java 25 虚拟线程的新特性和改进进一步提升了虚拟线程的性能和可用性。通过合理地使用虚拟线程我们可以构建更高效、更可扩展的并发系统。这其实可以更优雅一点。希望这篇文章能帮助大家更好地理解和实践 Java 25 虚拟线程的新特性。如果你有任何问题欢迎在评论区留言。关于作者我是 Alex一个在 CSDN 写 Java 架构思考的暖男。喜欢手冲咖啡养了一只叫Java的拉布拉多。如果我的文章对你有帮助欢迎关注我一起探讨 Java 技术的优雅之道。

相关文章:

Java 25 虚拟线程新特性与实践:构建更高效的并发系统

Java 25 虚拟线程新特性与实践:构建更高效的并发系统 别叫我大神,叫我 Alex 就好。 一、引言 大家好,我是 Alex。Java 虚拟线程(Virtual Threads)自 Java 21 引入以来,已经成为 Java 并发编程的重要变革。…...

AI赋能开发:让快马智能生成telnet会话录制与自动化回放测试工具

最近在做一个网络设备的自动化测试项目,需要频繁通过telnet进行配置验证。传统的手工测试效率太低,于是尝试用AI辅助开发一个智能化的telnet会话录制与回放工具。整个过程在InsCode(快马)平台上完成,体验非常流畅。 需求分析 首先明确工具需要…...

OpenClaw多模型切换指南:Qwen3-14B与本地小模型协同工作

OpenClaw多模型切换指南:Qwen3-14B与本地小模型协同工作 1. 为什么需要多模型协同? 去年冬天,当我第一次用OpenClaw自动处理周报时,发现一个尴尬的问题:简单的文件整理任务消耗了过多Token。我的Qwen3-14B模型像用高…...

嵌入式系统可靠性设计:内存保护与硬件检测实践

1. 嵌入式系统可靠性设计概述在工业控制、医疗设备和汽车电子等关键领域,嵌入式系统的可靠性直接关系到人身安全和财产安全。作为一名有十年嵌入式开发经验的工程师,我见过太多因可靠性设计不足导致的现场故障。这些故障往往不是由复杂算法错误引起&…...

Switch破解新选择:大气层系统稳定版完整安装与优化指南

Switch破解新选择:大气层系统稳定版完整安装与优化指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要让你的Switch焕发新生,体验自制软件和游戏优化的无限可能…...

Python新年倒计时:用代码打造节日氛围的创意实践

1. 为什么用Python做新年倒计时? 每到年底,朋友圈就会被各种新年倒计时刷屏。你有没有想过用代码打造一个专属的倒计时工具?Python凭借其简洁的语法和丰富的库,特别适合这类创意编程项目。 我去年就用Python给团队做了个新年倒计时…...

Edge 浏览器:全面解析与深入体验

Edge 浏览器:全面解析与深入体验 引言 随着互联网技术的飞速发展,浏览器已经成为我们日常生活中不可或缺的工具。在众多浏览器中,Edge 浏览器凭借其出色的性能和丰富的功能,赢得了广大用户的青睐。本文将全面解析 Edge 浏览器的特点、功能以及用户体验,帮助您更好地了解…...

5V供电标准的历史演变与现代应用

1. 5V供电的历史渊源与技术背景上世纪60年代末,德州仪器(TI)推出的7400系列TTL逻辑芯片确立了5V供电标准。这个电压值并非随意选定,而是经过严谨的工程权衡:在当时的硅工艺条件下,5V能在晶体管导通损耗&…...

【实战解读】腾讯云ClawPro正式发布:企业版OpenClaw 10分钟上线,三级Token配额+四层安全防护全解析

腾讯云正式发布企业版OpenClaw——ClawPro,定位为一站式企业AI智能体管控平台。本文从产品定位、三级Token配额体系、四层安全防护、技术架构、部署实操等角度做深度解读,帮助企业技术决策者评估是否适合引入ClawPro。附部署流程和成本分析。 目录前言一…...

nuviot嵌入式物联网库:GP001平台端到端连接方案

1. nuviot 嵌入式物联网开发库深度解析:面向 GP001 硬件平台的端到端连接方案1.1 库定位与工程价值nuviot 是一套专为嵌入式物联网终端设计的轻量级 C 语言库集合,其核心目标并非提供通用 IoT 协议栈,而是在 GP001 硬件平台(NuvIo…...

MPR121电容触摸传感器驱动与抗干扰工程实践

1. MPR121电容式接近/触摸传感器控制器深度技术解析 MPR121是由NXP Semiconductors(原Freescale)推出的12通道电容式触摸与接近感应专用协处理器芯片,广泛应用于STM32、ESP32、nRF52等主流MCU平台的嵌入式人机交互系统中。该器件并非通用IC外…...

python pyoxidizer

# 关于PyOxidizer的一些思考 最近在Python打包工具领域,有个工具引起了不小的讨论,那就是PyOxidizer。如果你经常需要将Python代码打包成可执行文件,或者部署到没有Python环境的机器上,可能会对这个工具感兴趣。 它到底是什么 PyO…...

python py2exe

# 把Python脚本变成Windows可执行文件:聊聊py2exe 如果你写过一些Python脚本,可能会遇到这样的场景:写了个挺实用的小工具,想分享给同事或朋友用,但他们电脑上可能没装Python环境。这时候就需要把.py文件变成.exe可执行…...

python cx_freeze

# 关于 PyInstaller,一位 Python 老手的随想 最近在整理一些旧项目,又用到了 PyInstaller 这个工具。说起来,它算是 Python 开发中一个既熟悉又容易被忽视的存在。很多开发者第一次接触它,往往是为了把写好的脚本发给不会装 Pytho…...

ModTheSpire终极指南:5个技巧让杀戮尖塔模组加载零烦恼

ModTheSpire终极指南:5个技巧让杀戮尖塔模组加载零烦恼 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 厌倦了每次想体验新模组都要手动修改游戏文件的繁琐操作吗&#xff…...

解放加密音乐:ncmdump的格式转换革新

解放加密音乐:ncmdump的格式转换革新 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 一、价值定位:破解NCM格式限制的技术方案 ncmdump作为一款开源工具,专为破解网易云音乐NCM加密格式而设计&am…...

内存屏障与volatile:并发编程的核心机制解析

1. 内存屏障与volatile的核心概念解析在并发编程领域,内存屏障和volatile是两个至关重要的底层技术。它们看似简单,却直接影响着程序的正确性和性能表现。理解这两个概念需要从计算机体系结构的多个层面进行分析。1.1 volatile关键字的本质作用volatile在…...

Linux性能调优工具全景解析与实战指南

1. Linux性能调优工具全景图解析作为一名在Linux系统管理领域摸爬滚打多年的老手,我深知性能调优是系统管理员和开发者的必修课。今天我要分享的这组工具图谱,可以说是Linux性能分析的"九阳真经"。这些图表最初由Brendan Gregg等性能专家整理&…...

OpenClaw多模型切换术:Gemma-3-12b-it与Qwen3-32B混合调用指南

OpenClaw多模型切换术:Gemma-3-12b-it与Qwen3-32B混合调用指南 1. 为什么需要多模型混合调用? 去年我在用OpenClaw自动化处理技术文档时,发现一个有趣现象:当让AI帮我写Python脚本时,Qwen3-32B表现优异;但…...

002、环境搭建:Python虚拟环境、LangChain安装与核心依赖解析

002、环境搭建:Python虚拟环境、LangChain安装与核心依赖解析从一次深夜调试说起 上周三凌晨两点,我被一个诡异的错误钉在屏幕前:明明本地测试通过的LangChain智能体,在同事的机器上死活跑不起来。报错信息指向一个版本冲突——py…...

001、开篇:为什么是LangChain?大模型应用开发范式变革

001、开篇:为什么是LangChain?大模型应用开发范式变革 昨天深夜调试一个对话场景,被大模型的输出格式折腾得够呛。需求很简单:从用户消息里提取时间、地点、事件三个字段,返回结构化的JSON。我对着API文档写了二十多行…...

OpenClaw极限测试:Phi-3-mini-128k-instruct连续运行7天稳定性报告

OpenClaw极限测试:Phi-3-mini-128k-instruct连续运行7天稳定性报告 1. 测试背景与动机 去年夏天,当我第一次在个人笔记本上部署OpenClaw时,最担心的不是功能实现,而是长期运行的稳定性。作为一个需要7*24小时工作的自动化助手&a…...

AITINKR_JSON_FIELDS:面向MCU的零碎片JSON字段管理库

1. AITINKR_JSON_FIELDS 库深度解析:面向资源受限 IoT 设备的动态 JSON 字段管理方案在嵌入式物联网设备开发中,JSON 已成为事实上的数据交换标准。从传感器数据上报、OTA 配置下发,到设备状态同步与远程控制指令解析,JSON 的轻量…...

【优化求解】用于密集子图和密集子矩阵问题的凸优化附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

OpenClaw+千问3.5-9B学术助手:自动整理参考文献与生成综述

OpenClaw千问3.5-9B学术助手:自动整理参考文献与生成综述 1. 为什么需要自动化文献处理 去年冬天,当我面对堆积如山的PDF文献时,突然意识到传统文献管理方式已经跟不上现代研究的节奏。手动标注重点、复制粘贴引用、反复切换不同文献工具—…...

STM32外设驱动:内存映射与寄存器操作详解

1. STM32外设驱动基础:内存映射与寄存器操作在嵌入式开发领域,STM32系列单片机因其出色的性能和丰富的外设资源而广受欢迎。要真正掌握STM32的开发,理解其底层外设驱动机制至关重要。让我们从一个工程师的视角,深入剖析STM32外设驱…...

电力系统调度员最头疼的就是负荷曲线上的“尖峰时刻“,储能系统就像个会算账的中间商,在电网里玩转时间差。咱们今天用数学语言聊聊这个“高抛低吸“的生意经

储能的削峰填谷作用,如下图所示的削峰填谷数学模型,利用cplex求解混合整数规划可得结果。先看模型骨架,整个问题可以抽象成24小时时间窗里的充放电策略。我习惯把模型拆解成三个关键部分:决策变量、经济目标、物理约束。用CPLEX建…...

Amadeus的知识库 | 告别碎片化集成:深度解析 AI 时代的“USB 协议” —— MCP

一、引文在 LLM(大语言模型)飞速发展的今天,我们正从“对话框 AI”转向“智能体(Agent)”。然而,开发者在集成 AI 时一直面临一个巨大的痛点:数据孤岛。为了解决这个问题,Anthropic …...

避坑指南:在Ubuntu 22.04上为Autoware配置Docker与NVIDIA GPU支持(含代理与镜像源配置)

深度避坑:Ubuntu 22.04下Autoware与Docker的GPU实战配置全解 当你在深夜的终端前反复输入docker run --gpus all却只收获冰冷的错误提示时,这种挫败感我深有体会。本文不是又一份标准安装教程,而是从17次失败尝试中提炼出的生存手册&#xff…...

SystemView在RT-Thread嵌入式开发中的实战应用

1. SystemView工具概述SystemView是SEGGER公司推出的一款嵌入式系统可视化分析工具,专门用于调试和分析实时操作系统(RTOS)的运行情况。作为一名长期从事嵌入式开发的工程师,我亲身体验过这款工具在项目调试中的强大作用。SystemView的核心功能在于它能够…...