Java 响应式编程是一种基于异步数据流处理的编程范式,它强调数据流的声明式构建和传播变化的自动响应。Java 9 引入的Flow API为响应式编程提供了标准接口,而 Reactor 和 RxJava 等第三方库则提供了更丰富的操作符和工具。

核心概念

  1. Publisher(发布者):产生数据流的源头。
  2. Subscriber(订阅者):消费数据流的接收者。
  3. Subscription(订阅):连接发布者和订阅者的桥梁,管理背压(Backpressure)。
  4. Processor(处理者):兼具发布者和订阅者的功能,用于转换数据流。

简单示例:使用 Java Flow API

下面是一个使用 Java 标准库Flow API的简单响应式编程示例:

import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;public class ReactiveExample {public static void main(String[] args) throws InterruptedException {// 创建发布者try (SubmissionPublisher<String> publisher = new SubmissionPublisher<>()) {// 创建订阅者Flow.Subscriber<String> subscriber = new Flow.Subscriber<>() {private Flow.Subscription subscription;@Overridepublic void onSubscribe(Flow.Subscription subscription) {System.out.println("订阅成功");this.subscription = subscription;subscription.request(1); // 请求1个数据}@Overridepublic void onNext(String item) {System.out.println("接收到数据: " + item);subscription.request(1); // 处理完后再请求1个}@Overridepublic void onError(Throwable throwable) {System.out.println("发生错误: " + throwable.getMessage());}@Overridepublic void onComplete() {System.out.println("数据流处理完成");}};// 订阅publisher.subscribe(subscriber);// 发布数据publisher.submit("Hello");publisher.submit("Reactive");publisher.submit("World");// 等待所有数据处理完成Thread.sleep(1000);}}
}

常用操作符(以 Reactor 库为例)

Reactor 是 Spring 生态中推荐的响应式编程库,提供了Mono(0-1 个元素)和Flux(0-N 个元素)两种核心类型:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;public class ReactorExample {public static void main(String[] args) {// 创建FluxFlux<String> flux = Flux.just("A", "B", "C").map(String::toLowerCase)  // 转换操作.filter(s -> s.startsWith("a"));  // 过滤操作// 创建MonoMono<String> mono = Mono.just("Hello").flatMap(s -> Mono.just(s + " World"));  // 异步转换// 订阅并消费flux.subscribe(System.out::println,  // 正常数据处理Throwable::printStackTrace,  // 错误处理() -> System.out.println("Flux完成")  // 完成回调);mono.subscribe(System.out::println);}
}

背压(Backpressure)处理

响应式编程的重要特性是支持背压,即消费者可以控制生产者发送数据的速率:

Flux.range(1, 1000)  // 生成1到1000的整数.onBackpressureBuffer(100)  // 缓冲100个元素.subscribe(num -> {// 模拟慢速处理try { Thread.sleep(100); } catch (InterruptedException e) {}System.out.println(num);},Throwable::printStackTrace,() -> System.out.println("处理完成"));

响应式 Web 示例(Spring WebFlux)

Spring WebFlux 是基于 Reactor 的响应式 Web 框架:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;@SpringBootApplication
public class WebFluxExample {public static void main(String[] args) {SpringApplication.run(WebFluxExample.class, args);}
}@RestController
class HelloController {@GetMapping("/hello")public Mono<String> hello() {return Mono.just("Hello, Reactive Web!");}
}

总结

Java 响应式编程通过异步数据流提供了高效处理大量并发请求的能力,适合构建非阻塞、低延迟的应用程序。主要应用场景包括微服务、实时数据处理和高并发系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93270.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93270.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93270.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【重学数据结构】二叉搜索树 Binary Search Tree

目录 二叉搜索树的数据结构 手写实现二叉搜索树 树节点定义 插入节点 源码 流程图 二叉树插入步骤图解 第一步: 插入 20 第二步: 插入 10 第三步: 插入 30 第四步: 插入 5 查找节点 源码 场景一: 查找成功 (search for 25) 第一步: 从根节点开始 第二步:…

四、计算机组成原理——第1章:计算机系统概述

目录 1.1计算机发展历程 1.1.1计算机硬件的发展 1.计算机的四代变化 2.计算机元件的更新换代 1.1.2计算机软件的发展 1.2计算机系统层次结构 1.2.1计算机系统的组成 1.2.2计算机硬件 1.冯诺依曼机基本思想 2.计算机的功能部件 (1)输入设备 (2)输出设备 (3)存储器 (4)运算器 (5)…

flutter TextField 失去焦点事件

在 Flutter 中&#xff0c;处理 TextField 的失去焦点事件&#xff08;即失去焦点时触发的操作&#xff09;通常有两种常用方式&#xff1a;使用 FocusNode 或 onEditingComplete 回调。以下是具体实现&#xff1a; import package:flutter/material.dart;class MyTextField e…

Moonlight for ChromeOS 常见问题解决方案

Moonlight for ChromeOS 常见问题解决方案 项目基础介绍 Moonlight for ChromeOS 是一个开源的 NVIDIA GameStream 客户端&#xff0c;允许用户将他们的游戏从高性能的桌面电脑流式传输到运行 ChromeOS 的设备上。该项目还支持 Android 和 iOS/tvOS 平台。Moonlight for Chrome…

SQL语句:读操作、写操作、视图

文章目录读操作分类基础查询语句示例高级查询--分组查询、子查询、表连接、联合查询分组查询&#xff1a;子查询&#xff08;嵌套查询&#xff09;表连接联合查询写操作视图SQL&#xff1a;结构化查询语言读操作 重点是where查询&#xff0c;即高级查询部分 分类 DML &#…

Python 机器学习实战:基于 Scikit-learn

本文围绕《Python 机器学习实战&#xff1a;基于 Scikit-learn 的项目开发》展开&#xff0c;先介绍 Scikit-learn 库的基础特性与优势&#xff0c;再阐述机器学习项目开发的完整流程&#xff0c;包括数据收集与预处理、模型选择与训练、评估与优化等。通过具体实战案例&#x…

java里List链式编程

java里对list的操作&#xff0c;我们一遍使用for遍历&#xff0c;输出或改变里面的内容。单经常在代码里面我们发现&#xff0c;也可以使用这样的代码结构daPaymentActionVo.setApnolist(paymentActionVo.getApnolist().stream().map(PaymentActionVo.Voucher::getApno).collec…

【esp32s3】7 - VSCode + PlatformIO + Arduino + 构建项目

一、PlatformIO 1.1. 概述 官方文档&#xff1a;What is PlatformIO? PlatformIO 是一个跨平台的物联网开发生态系统&#xff0c;专门为嵌入式系统开发设计&#xff0c;支持多种开发板和框架。 1.1.1. 主要特点 跨平台&#xff1a;支持 Windows、macOS 和 Linux多框架支持&…

LE AUDIO CIS/BIS音频传输时延的计算

LE AUDIO音频总时延计算方法 按照BAP的规范,LE AUDIO音频总延时包括三个部分:Audio Processing Time,Transport Latency,Presentation Delay。如下图所示是播放音乐的示例图: 这里还有一个麦克风录音的总时延示例图: Audio Processing Time:这个就是音频DSP获取音频数…

git 修改 更新

git 修改 更新先更新&#xff0c;后修改# 暂存当前修改 git add . git stash# 获取最新的 main 分支 git checkout main git pull# 新建开发分支 git checkout -b lbg_0727# ⚠️ 先把 main 的最新代码合并/变基到当前分支&#xff08;用于消除冲突&#xff09; # 方法1&#x…

飞鹤困局:增长神话的裂痕

增长天花板已然逼近&#xff0c;飞鹤需要探寻新方向。作者|安德鲁编辑|文昌龙“飞鹤&#xff0c;更适合中国宝宝体质”——这句曾让无数妈妈点头的广告语&#xff0c;帮飞鹤坐上了中国奶粉市场的头把交椅。可多年后&#xff0c;时代红利退潮&#xff0c;故事不好讲了。飞鹤的利…

Java设计模式之<建造者模式>

目录 1、建造者模式 2、建造者模式结构 3、实现 4、工厂模式对比 5、适用场景差异 前言 建造者模式是一种创建型设计模式。用于封装复杂对象的构建过程&#xff0c;通过步骤构建产品类。它包括产品类、抽象建造者、具体建造者和指挥者角色。 优点在于灵活性、解耦和易扩展…

fchown/fchownat系统调用及示例

55. fchmod - 通过文件描述符改变文件权限 函数介绍 fchmod是一个Linux系统调用&#xff0c;用于通过文件描述符来改变文件的访问权限。它是chmod函数的文件描述符版本&#xff0c;避免了路径名解析。 函数原型 #include <sys/stat.h> #include <unistd.h>int fchm…

20250726-5-Kubernetes 网络-Service 代理模式详解(iptables与ipvs)_笔记

一、服务三种常用类型  1. LoadBalancer类型 工作原理:与NodePort类似,在每个节点上启用端口暴露服务,同时Kubernetes会请求底层云平台(如阿里云、腾讯云、AWS等)的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加。 自动化实现:云厂商通过官方实现的控制…

horizon置备出错

报错内容如下&#xff1a; [2025/7/28 19:15] 置备 Customization failure: Customization of the guest operating system is not supported due to the given reason: 期间出错 解决方法&#xff1a;将模板转换为虚拟机&#xff0c;安装vmtools&#xff1b;再安装vmtools之后…

【unitrix】 6.19 Ord特质(ord.rs)

一、源码 这段代码定义了一个标记特征&#xff08;marker trait&#xff09;Ord 和三个实现&#xff0c;用于将类型标记与 Rust 标准库中的 Ordering 枚举关联起来。 use crate::sealed::Sealed; use core::cmp::Ordering; use crate::number::{Greater, Equal, Less}; /// 用于…

数据结构之顺序表链表栈

顺序表 什么是 list list 的使用 线性表是什么 顺序表是什么 顺序表和线性表的关系 顺序表和数组的区别 List 和 ArrayList 的关系 如何自己模拟实现 myArrayList ArrayList 的构造 ArrayList 的常见方法 以下两种写法有什么区别 ArrayList<Integer> arrayLis…

day062-监控告警方式与Grafana优雅展示

文章目录0. 老男孩思想-马太效应1. API监控2. zabbix的API接口2.1 生成zabbix的api token2.2 访问格式2.3 前端添加web监测3. 监控告警方式3.1 云监控-邮件告警3.1.1 邮箱开启授权码3.1.2 zabbix前端配置3.1.3 消息模板3.1.4 配置邮箱收件人信息3.1.5 配置触发器3.2 企业微信告…

Ettus USRP X410/X440 运行 ADC 自校准

Ettus USRP X410/X440 运行 ADC 自校准 打开一个接收&#xff08;Rx&#xff09;会话到您在设备名称输入中指定的设备并返回会话句柄 out&#xff0c;您可以使用该句柄在所有后续 NI-USRP VI 中识别此仪器会话。 支持设备&#xff1a;Ettus USRP X410/X440输入/输出 文明.png 会…

Qt元类型系统(QMetaType)详解

Qt元类型系统详解一、Qt元类型系统(QMetaType)详解1. 核心功能2. 注册机制3. 关键技术点4. 信号槽支持5. 流式传输支持6. 使用场景7. 注意事项二、完整示例1、基本实例2、基本实例3、元类型在信号槽中的应用4、高级用法三、元对象编译器moc元对象编译器&#xff08;Moc&#xf…