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

Reactive 编程-Loom 项目(虚拟线程)

Reactive 编程与 Loom 项目(虚拟线程)

Java 项目 Loom 是 Oracle 在 JVM 上的一项重大变革,旨在引入 虚拟线程(Virtual Threads),以简化并发编程。传统的 Java 线程是重量级的,由操作系统管理,资源占用较高,而 Loom 项目通过引入轻量级的虚拟线程,实现数百万级别的高并发编程,解决了传统 Java 线程在高并发场景下的不足。虚拟线程结合反应式编程(Reactive Programming)为 Java 开发者提供了一种新的并发编程模式。

一、传统线程模型的局限性

Java 中的传统线程是由操作系统内核管理的,每个线程都映射到一个操作系统线程。操作系统线程占用的内存相对较大,通常为 1MB,并且线程切换需要昂贵的上下文切换开销。随着并发任务的增加,线程数量增加会导致资源枯竭,阻碍高并发编程的实现。

在微服务、实时系统和高并发应用场景中,传统的线程模型面临以下主要问题:

  1. 线程数量有限:由于操作系统对线程数量的限制,Java 程序在大量并发任务下表现不佳。
  2. 线程上下文切换开销:频繁的上下文切换会影响 CPU 效率,增加延迟。
  3. 阻塞操作导致资源浪费:阻塞操作(如 I/O)会使线程闲置,降低并发效率。

为了解决这些问题,Java 社区引入了反应式编程模式,通过异步非阻塞的方式减少线程开销。虽然反应式编程能够处理大量并发请求,但编写和维护异步代码复杂且不易调试。Loom 项目提出的虚拟线程试图在传统阻塞编程模型和反应式编程之间找到平衡。

二、Loom 项目中的虚拟线程

虚拟线程(Virtual Threads)是 Loom 项目的核心创新,它通过在用户空间模拟线程,解除了传统操作系统线程的重量级限制。虚拟线程非常轻量级,数百万个虚拟线程可以在 JVM 上同时运行。

1. 虚拟线程的特点
  • 轻量级:虚拟线程的内存开销远小于传统线程,通常只有几 KB。
  • 大量并发:虚拟线程允许 JVM 处理数百万级别的线程,而不会产生大量的上下文切换开销。
  • 阻塞模型的回归:开发者可以在虚拟线程中编写阻塞代码,而不必担心资源浪费。虚拟线程在 I/O 等阻塞操作时会自动挂起,不占用系统资源。
2. 虚拟线程的工作原理

虚拟线程由 JVM 而非操作系统管理。它们的运行机制类似于“纤程”(coroutines),但更加透明和易用。当虚拟线程遇到阻塞操作时,JVM 会自动将其挂起并让出 CPU,避免线程资源的浪费。这与传统的异步模型不同,开发者可以使用熟悉的同步代码编写风格,而不用引入复杂的回调或 CompletableFuture 等异步结构。

public class LoomExample {public static void main(String[] args) throws InterruptedException {Thread virtualThread = Thread.ofVirtual().start(() -> {System.out.println("Hello from virtual thread!");});virtualThread.join();}
}

在上面的代码中,我们使用 Thread.ofVirtual() 创建了一个虚拟线程,它的行为与普通线程类似,但更加轻量。虚拟线程可以并发执行,但在系统中不造成大量的线程资源消耗。

三、Reactive 编程与虚拟线程的结合

Reactive 编程旨在通过异步非阻塞的方式处理大量并发任务,避免阻塞操作造成的资源浪费。与传统的线程模型不同,Reactive 编程通常使用 PublisherSubscriber 模式来处理数据流和事件。其核心优势在于能够高效处理 I/O 密集型任务。

然而,Reactive 编程在代码编写上存在一定复杂度,尤其是在处理异步流控制、错误处理和回调时,代码可读性和维护性受到挑战。而虚拟线程的引入,为 Java 开发者提供了一种新选择。

1. Reactive 编程的优势
  • 非阻塞:Reactive 编程不依赖于线程阻塞,而是通过事件驱动模型处理并发请求。
  • 高吞吐量:由于不阻塞线程,Reactive 模型可以处理大量并发连接,极大提高了系统的吞吐量。
  • 回压机制:Reactive 流的回压(backpressure)机制可以处理生产者和消费者速率不匹配的问题,确保系统不会因数据过载而崩溃。
2. 虚拟线程与反应式编程的协同

尽管虚拟线程和 Reactive 编程在设计目标上有所重叠——都旨在高效处理并发任务,但它们的实现方式不同。虚拟线程通过简化并发模型让开发者能够编写看似阻塞的代码,而无需使用复杂的异步操作。而 Reactive 编程则依赖事件驱动模型,在多个请求之间共享线程资源。

虚拟线程和 Reactive 编程各有所长,可以在不同场景下协同工作。例如,对于 I/O 密集型任务,虚拟线程允许开发者使用简单的同步代码进行处理,而不引入复杂的异步控制流。同时,对于需要处理大规模事件流的场景,Reactive 编程模型依然是更合适的选择,因为它能够提供更好的事件控制和回压机制。

在某些复杂系统中,可以同时利用虚拟线程和 Reactive 编程的优势。例如,在微服务架构中,使用虚拟线程来处理网络 I/O,而内部的数据处理逻辑则使用 Reactive 流进行处理,从而提升系统的并发能力。

四、Loom 虚拟线程的应用场景

虚拟线程的引入极大简化了 Java 并发编程,尤其适用于以下场景:

1. 高并发 Web 应用

对于需要处理大量并发请求的 Web 应用,虚拟线程可以显著提高系统的吞吐量。传统的 Java 线程模型通常需要大量线程来处理并发连接,而虚拟线程能够以非常小的资源开销处理数百万个并发连接。

2. I/O 密集型应用

对于 I/O 密集型应用,虚拟线程能够轻松管理大量 I/O 操作,而不会像传统线程那样阻塞资源。每个 I/O 操作可以通过虚拟线程挂起,JVM 会高效管理这些挂起的线程,使系统能够处理更多的并发操作。

3. 微服务架构

在微服务架构中,每个服务通常处理多个并发请求并与其他服务通信。虚拟线程能够让每个请求拥有一个独立的线程,而不会造成系统资源的枯竭。这种轻量级线程模型能够简化微服务的实现,并提高其可扩展性。

4. 游戏服务器

游戏服务器通常需要处理大量玩家的并发请求,包括网络通信和数据库访问。虚拟线程的高并发处理能力和低延迟特性使其非常适合用于构建游戏服务器。

五、虚拟线程的局限性

尽管虚拟线程为 Java 并发编程带来了诸多优势,但它并不是银弹,仍然存在一些局限性:

  1. 调试难度:虚拟线程虽然简化了并发模型,但调试和监控虚拟线程的行为可能比传统线程更加复杂,尤其是在出现死锁或线程挂起等问题时。
  2. 未能完全替代 Reactive 编程:在某些特定场景下,如大规模事件流处理和需要精确控制的异步任务,Reactive 编程仍然是更为适合的选择。
  3. 生态支持:虽然 Loom 项目在 Java 中引入了虚拟线程,但并非所有的库和工具都能够立即支持这一新特性,尤其是在与现有的线程池和并发库集成时,可能会出现兼容性问题。

六、总结

Loom 项目的虚拟线程为 Java 并发编程带来了全新的思路,通过简化并发模型,降低线程的开销,虚拟线程极大提升了高并发场景下的性能。对于开发者来说,虚拟线程的引入不仅减少了编写异步代码的复杂性,还提高了系统的可扩展性。同时,虚拟线程与 Reactive 编程可以相互补充,结合两者的优势,可以构建出高效、低延迟、

相关文章:

Reactive 编程-Loom 项目(虚拟线程)

Reactive 编程与 Loom 项目(虚拟线程) Java 项目 Loom 是 Oracle 在 JVM 上的一项重大变革,旨在引入 虚拟线程(Virtual Threads),以简化并发编程。传统的 Java 线程是重量级的,由操作系统管理&…...

Windows下使用MinGW编译安装zmq的步骤

背景: 在开发过程中,需要使用zmq库进行数据交互,因此需要编译zmq库。 安装步骤 软件下载 https://github.com/zeromq/libzmq.git 下载,将代码切换到git checkout 4c6cff6391分支 软件编译 cd .\libzmq\ mkdir build cd .\bu…...

电商云账户分账系统:打造高效资金流转体系

在当今的电子商务时代,随着消费者购物习惯的转变和在线交易量的激增,电商平台的运营模式也日趋复杂。为了满足多商家共存、利益共享的需求,电商分账成为了一个至关重要的环节。 电商分账是指电商平台在销售商品或服务后,根据事先…...

设计模式 -- 单例设计模式

1.1 单例 创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。 SingleModel 类提供了一个静态方法,供外界获取它的静态实例。 DesignTest 我们的演示类使用 SingleModel 类来获取 SingleModel 对象。 创建 Single…...

python fastapi 打包exe

创建虚拟环境 python -m venv 国内依赖仓库 # 换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com 安装nuitka pip install nuitka 生成exe nuitka --mingw64 --show-progress --s…...

【测试开岗面试】知识点总结

1.知识点总结 Q:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试 (Unit Testing) 单元测试是对软件中最小可测试单元(通常是函数或方法)进行验证的过程。它的目的是确保每个单元在设计时的功能能够正常运行。单元测试通常由…...

【高级编程】synchronized 解决并发问题 类的线程安全类型

文章目录 并发问题同步方法同步代码块 线程安全类型ArrayListHashtableHashMapVector 多线程共享数据引发的问题 模拟 “A” “B” “C” 三人抢票,总票数10张,打印抢票情况以及剩余票数。 public class Site implements Runnable {int count 10; // …...

Speculative RAG:为知识密集型数据服务的RAG

论文链接 RAG的一个棘手问题是不知道该召回多少chunk,少了可能丢信息,多了会引入噪声信息。虽然有self-reasoning等自我反思的解决办法,但是整体链路太长,延迟高,不利于工业落地。 虽然无法面对整个服务场景&#xff…...

[Go]-抢购类业务方案

文章目录 要点:1. 抢购/秒杀业务的关键挑战2. 技术方案3.关键实现点4.性能优化建议5.其他考虑因素 细节拆分:1. **高并发处理**2.**限流与防护**3.**库存控制**4. **异步处理**5. **数据一致性**6. **常用架构设计**7. **代码示例**8. 进一步优化9. 注意…...

Android 源码多个Launcher设置默认Launcher

目录 第一部分、android10之前 一.多个launcher 启动设置默认launcher的核心类 二 在自定义服务里面设置默认Launcher 第二部分、android10之后 一、Launcher应用内置并设置为默认Launcher 1.通过ResolverActivity.java设置为默认Launcher 改法一: 改法二&am…...

计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

深度学习中实验、观察与思考的方法与技巧

在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。以下是一些有效的方法与技巧,可以帮助你在深度学习实践中系统性地开展实验、分析结果并进行深入思考: 1. 明确实验目标 在开始实验前,确保对实验的目标有清晰的定…...

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…...

http连接github远程仓库密码问题解决办法

目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…...

LAMP环境下项目部署

目录 目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 2、关闭防火墙和selinux 查看防火墙状态 关闭防火墙 查看SELinux的状态 临时关闭SELinux 永久关闭SELinux:编辑SELinux的配置文件 配置文件的修改内容 3、检查系统…...

Visual Studio 2022从外部引入dll导致的问题

这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中,有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下: 3、点击浏览选项,选择想要引入dll的路径,这里我选择下载MapGIS 10的路径 …...

大模型从失败中学习 —— 微调大模型以提升Agent性能

人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时,通常只使用成功的交互轨迹,而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费,也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…...

10.web应用体系以及windows网络常见操作应用

一、Dos命令 1.启动方式:winR,输入cmd 2.切换盘符/路径:盘符名称: (C:) cd 目录 (cd B111)(目录名按table键自动补全) 3.查看目录:dir dir /p 分页展示目录及…...

【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721

1. 力扣19:删除链表的倒数第N个节点 1.1 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: …...

机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)

机器学习之实战篇——Mnist手写数字0~9识别(全连接神经网络模型) 文章传送MNIST数据集介绍:实验过程实验环境导入模块导入MNIST数据集创建神经网络模型进行训练,测试,评估模型优化 文章传送 机器学习之监督学习&#…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...