Java虚拟线程

【Java虚拟线程】Java21、SpringBoot3中使用虚拟线程 最近有读取文件中数据的需求,且数据量百万至千万,普通的多线程读取方式还是很慢。遂想到Java21中虚拟线程,在网上学习了一圈,简单的在这里记一个笔记,方便日后查找。 阅读详情

虚拟线程在Java中的引入版本、特点及使用场景

1. 引入版本

  • 预览版本:Java 19(2022年9月)首次引入虚拟线程作为预览特性。
  • 正式发布:Java 21(2023年9月)将虚拟线程作为正式特性发布,成为长期支持(LTS)版本的一部分。
  • 后续改进:Java 22及更高版本持续优化虚拟线程,例如增强调度算法和兼容性。

2. 核心特点

2.1 轻量级与高并发

  • 资源占用极低:每个虚拟线程仅需几KB内存,远低于传统线程的1MB栈空间。
  • 支持数百万线程:突破操作系统线程数量限制(通常仅支持数千个),可轻松创建百万级虚拟线程。

2.2 非阻塞调度

  • 自动挂起与恢复:遇到I/O或锁等阻塞操作时,虚拟线程自动挂起并释放底层平台线程,待操作完成后恢复执行。
  • 平台线程复用:底层平台线程(由操作系统管理)可复用执行多个虚拟线程,减少上下文切换开销。

2.3 编程模型简化

  • 兼容传统API:直接兼容Thread类,可通过Thread.startVirtualThread()或Thread.ofVirtual().start()创建。
  • 同步编程风格:支持同步代码编写,避免异步回调或CompletableFuture的复杂性。

2.4 与平台线程的对比

特性虚拟线程平台线程
管理方式JVM用户态调度操作系统内核调度
资源占用低(KB级)高(MB级栈空间)
适用场景I/O密集型任务CPU密集型任务
阻塞处理自动挂起并释放资源阻塞导致线程停滞

3. 典型使用场景

3.1 高并发I/O密集型应用

  • Web服务器:处理数万并发HTTP请求(如Spring Boot应用),每个请求分配一个虚拟线程,简化代码逻辑。
  • 微服务调用:并行处理多个远程服务调用(如REST API、数据库查询),避免线程池瓶颈。

3.2 数据处理与批处理

  • 并行文件处理:同时读取/处理大量文件,每个文件操作分配一个虚拟线程。
  • 数据导入/导出:数据库批量操作时,避免连接池耗尽。

3.3 消息系统与实时处理

  • 消息消费:并发处理Kafka、MQTT等消息队列中的大量消息,提升吞吐量。
  • 实时交易系统:金融领域的高并发低延迟交易处理。

3.4 替代复杂异步模型

  • 响应式编程替代:用同步代码替代Reactor或Project Reactor的复杂异步逻辑,提升可读性。

4. 限制与注意事项

  • 不适用于CPU密集型任务:长时间计算任务会占用平台线程,影响其他虚拟线程执行。
  • 资源管理:需注意文件句柄、数据库连接等资源的正确关闭,避免泄漏。
  • 调试与监控:传统工具可能难以管理百万级虚拟线程,需使用JDK自带工具(如jstat、jconsole)或第三方工具。

5. 示例代码

5.1 创建虚拟线程

// 方式1:直接创建并启动
Thread virtualThread = Thread.startVirtualThread(() -> {
    System.out.println("Running in a virtual thread: " + Thread.currentThread());
});

// 方式2:通过Thread.Builder创建
Thread.Builder builder = Thread.ofVirtual().name("my-vt-");
builder.start(() -> {
    System.out.println("Virtual thread with custom name");
});

5.2 使用ExecutorService

try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(() -> {
        System.out.println("Task executed in a virtual thread");
    });
}

5.3 处理并发请求

IntStream.range(0, 1000).forEach(i -> {
    Thread.startVirtualThread(() -> {
        System.out.println("Processing request " + i);
        // 模拟I/O操作
        Thread.sleep(1000);
    });
});

6. 结论

虚拟线程通过轻量级设计和高效调度,显著提升了Java在高并发I/O场景下的性能,同时保持了代码的简洁性。其引入标志着Java并发编程模型的重大进步,尤其适合现代分布式系统和微服务架构的需求。开发者应在I/O密集型场景中积极采用,以充分利用其优势。

思维导图

Java虚拟线程

虚拟线程的定义及使用 长期以来,虚拟线程是 Java 中最重要的创新之一。 它们是在 Project Loom 中开发的,自 Java 19 作为预览功能以来一直包含在 JDK 中,自 Java 21 作为最终版本 (JEP 444) 以来,它们已包含在 JDK 中。 阅读详情

相关推荐

Java19 虚拟线程原理介绍及实现

本文介绍了 Java 线程模型、Java 虚拟线程的使用、原理和适用场景,并与流行的 Go 协程 进行了比较,也发现了两种实现方式的相似之处,希望对大家理解 Java 虚拟线程有所帮助。

Hello! 5620

Java21新特性-虚拟线程

是轻量级线程(类似于 Go 中的 “(Goroutine)”),可以减少编写、维护和调度高吞吐量并发应用程序的工作量。是可供调度的最小处理单元,它与其他类似的处理单元并发运行,并且在很大程度上是独立运行的。线程()有两种,和。

听得到微笑的博客 1万+

一文读懂Java 虚拟线程

虚拟线程是 Java 21 中引入的一种新的线程抽象,它可以简化并发编程,并提高应用的吞吐量。虚拟线程是一种轻量级的线程实现方式,它可以在用户级别进行线程调度和管理,而不会占用 OS 线程。虚拟线程的使用非常简单,只需要调用 Thread 类的静态方法或者使用虚拟线程工厂或执行器即可。虚拟线程的优势在于,它可以大大减少线程切换的开销,提高 CPU 的利用率,同时支持更多的并发任务。虚拟线程还可以避免一些常见的并发问题,如死锁、内存泄漏、线程安全等。

Mickey的博客 1473

Java 虚拟线程

虚拟线程是由 JVM 管理的轻量级线程,通过将 Java 线程与操作系统线程解耦来实现高并发。与受系统资源限制的传统线程(称为平台线程)不同,虚拟线程在用户空间中管理,可以在不压垮系统的情况下实现数百万个并发操作。

小DuDu的博客 3188

深入解析JAVA虚拟线程

本文深入探讨了JDK21引入的虚拟线程技术,通过修改JVM和基础类库实现百万级IO密集型并发。虚拟线程采用Continuation机制,在阻塞时保存栈帧并释放平台线程,恢复执行时重新装载栈帧,保持阻塞式编程习惯不变。文章分析了Continuation和VirtualThread核心类的工作原理,以及虚拟线程对ThreadLocal、Sleep()和OkHttp等场景的影响。相比传统线程,虚拟线程内存占用更低(约2KB),支持海量并发,且无需修改现有代码。

huachangzai的博客 1178

Nacos2.X 源码分析:为订阅方推送、服务健康检查、集群数据同步、grpc客户端服务端初始化

而Nacos2.X 从http请求改为了grpc请求的方式了,在健康检查这方面就是基于长连接来实现的。客户端发送心跳是在构建grpc连接时会有一个线程每隔5s发送一次,NacosClient端发送心跳的代码在。我们能大致猜测:当一个服务的实例进行了更新,那么是不是应该推送给所有订阅了该服务的客户端?当我订阅了某个服务,是不是应该将该服务信息推送给我?在服务实例检查检查流程中,如果出现了要注销的服务实例就会发布。在服务发现时,进行订阅服务的最后会发布一个。服务注册与服务订阅流程中发布的事件最终会被。

qq_44027353的博客 1594

Java虚拟线程:揭开java虚拟线程的面纱

在高并发编程领域,线程一直是一个关键的概念。传统的 Java 线程是对操作系统线程的一对一映射,这种实现方式虽然简单直观,但在面对现代高并发场景时却显得力不从心。每个线程都需要占用大量系统资源,且线程切换的开销较大,这严重限制了应用程序的扩展性。为了解决这个问题,一些编程语言采用了更轻量级的并发原语-协程。比如Go语言的goroutinePython的asyncio,它们都能以极低的资源消耗支持大规模并发。而在 Java 世界中,随着JDK 21的发布,虚拟线程(Virtual Thread)

秃了也弱了 2252

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 702

java虚拟线程

要注意虚拟线程并不是用来直接取代平台线程的,虚拟线程是运行在平台线程之上的,一个平台线程可以对应多个虚拟线程,同时一个平台线程还是一一对应内核线程,因此上面的架构就变成了如下,一个 VT 代表一个虚拟线程。Java 中的线程跟操作系统的内核线程是一对一的,Java 线程的调度其实是依赖操作系统的内核线程的,这就导致了我们的线程切换和运行就需要进行上下文切换以及消耗大量的系统资源。JDK 的调度器没有直接将虚拟线程分配给系统线程,而是将虚拟线程分配给平台线程(这是前面提到的虚拟线程的 M:N 调度)。

yearraey的博客 2370

Zephyr RTOS线程间通讯实战:消息队列与信号量的5个经典应用场景

本文深入探讨了Zephyr RTOS中线程间通讯的核心机制,通过消息队列与信号量的组合,详细解析了传感器数据处理流水线、命令分发系统、日志记录、资源池管理以及周期性任务协同调度等5个经典应用场景。这些实战模式为构建高效、稳定且可维护的嵌入式多线程系统提供了清晰的设计蓝图和代码范例。

tomato的博客 94

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2833

Java21 虚拟线程

虚拟线程与Go语言中的协程类似,使得编写高并发、高吞吐量的应用程序变得更加简单和高效,尤其在处理I/O密集型任务时,能够显著提升系统的并发能力。打个比喻,创建线程就是招人,线程池就是我们招进来的人,多线程就是多个人在一个工厂一个人看一台机器,线程池相当于一个工人可以同时看多个机器,密集io相当于需要工人介入时间较少的机器,密集计算相当于工人介入较长时间的机器。虚拟线程的引入确实极大的降低创建和管理线程的开销,使用并发编程更高效便捷,但并不意味着多线程或线程弛就变得。来创建和管理虚拟线程。

sunyingboaini的博客 1857

从ADC校准到精准测量:避开PY32F030小信号采样的那些坑

本文深入探讨了PY32F030微控制器进行ADC小信号采样时面临的挑战与解决方案。从硬件设计、软件滤波算法到系统级校准策略,详细分析了如何避开常见陷阱,实现精准测量,特别是在25mV以下小信号场景中的应用实践。

ujm567890的博客 758

Java虚拟线程探索

Java虚拟线程探索

weixin_45632038的博客 1823

Ceres&OpenCV 单目相机标定(论文复现)

Ceres&OpenCV 单目相机标定(论文复现)

dayuhaitang1的博客 370

【华为OD技术面-手撕算法代码真题】- 最长公共前缀

🌟 强烈推荐:华为OD技术面试手撕算法代码真题 🌟大家好!今天我给大家推荐一份备受赞誉的华为OD技术面试手撕算法代码真题。所有题目均为华为od实际面试过程中出现的算法代码真题。

算法大师! 4884

Java21虚拟线程实践

虚拟线程是一种轻量化的线程封装,由jvm直接调度和管理。反之普通的线程其实是调用的操作系统的能力,对应的是操作系统级的线程。相对虚拟线程来说操作系统级的线程持有成本很高,而且受操作系统调度和管理的。实际在普通多线程情况下,如果出现IO阻塞,这个线程就必须得跟着阻塞,这个线程对应的操作系统就被阻塞,而他却持有大量的内存。另外,要处理大量的IO就得新建更多线程,而大量的线程会在操作系统切换时因上下文切换导致大量的CPU被浪费。

xindoo 7886

YOLOv11的多任务学习:检测+分割+姿态估计-(扩展模型头部分支,实现多任务联合训练)

YOLOv11作为Ultralytics团队于2024年9月发布的最新YOLO系列模型,在前代版本基础上进行了多项架构创新,使其成为支持多任务学习的理想框架。其核心改进包括引入C2PSA(跨阶段局部自注意)模块,将跨阶段局部网络和自注意机制优势结合,使模型能够更有效地跨多层捕获上下文信息。C3k2模块取代了之前的C2f模块,作为CSP Bottleneck的自定义实现,使用两个较小卷积核而非一个大卷积核,在保持准确性的同时提高了效率。 多任务学习(Multi-Task Learning, MTL)在YOL

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 655

java21虚拟线程

摘要:Java虚拟线程(Virtual Thread)是轻量级线程,通过Continuation机制运行在平台线程(Platform Thread)之上,相比操作系统线程更节省资源。其核心是将任务封装为Continuation对象,由ForkJoinPool调度器管理执行。运行时会挂载到平台线程执行任务,完成后卸载并保存状态,通过状态机管理生命周期。虽然支持ThreadLocal但推荐使用ScopedValues避免内存问题,实现了高并发场景下的高效线程管理。(149字)

Xxxx_jc_zust的博客 918

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java 19 虚拟线程

Java 19 虚拟线程介绍

DevCampsite的博客 5685

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java21 中的虚拟线程

在以前的JDK中,Java的线程模型其实比较简单,在大多数操作系统中,主要采用的是基于轻量级进程实现的一对一的线程模型,简单来说就是每一个Java线程对应一个操作系统中的轻量级进程,这种线程模型中的线程创建、析构及同步等动作,都需要进行系统调用。而系统调用则需要在用户态(User Mode)和内核态(Kernel Mode)中来回切换,所以性能开销还是很大的。而新引入的虚拟线程,是JDK 实现的轻量级线程,他可以避免上下文切换带来的的额外耗费。

梧桐树的博客 1220

Java虚拟线程最佳实践

Java虚拟线程最佳实践

安静的软件工程师 2548
上一篇: ArrayList
下一篇: Java 集合框架
HuiSoul200
博客等级 码龄8年 274粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值