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

Java中的异步编程模式:CompletableFuture与Reactive Programming的实战

Java中的异步编程模式:CompletableFuture与Reactive Programming的实战

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java开发中,异步编程已经成为提高应用性能和响应速度的重要手段。今天我们将探讨Java中的两种常用异步编程模式:CompletableFuture和Reactive Programming,并通过实际代码示例来展示它们的使用场景和优势。

一、使用CompletableFuture进行异步编程

CompletableFuture是Java 8引入的强大工具,提供了对Future的增强支持,可以以更加简洁的方式编写异步代码。

  1. 基本使用

    CompletableFuture可以创建非阻塞的异步任务,并允许任务完成时触发回调。以下是一个简单的示例:

    package cn.juwatech.async;import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 模拟长时间的计算try {Thread.sleep(1000);} catch (InterruptedException e) {throw new IllegalStateException(e);}return "Hello, CompletableFuture!";});// 注册回调函数future.thenAccept(result -> System.out.println("计算结果: " + result));// 阻塞主线程等待结果 (仅用于示例)try {System.out.println("等待计算完成...");System.out.println("最终结果: " + future.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
    }
    

    在这个示例中,supplyAsync方法会异步执行提供的函数(一个模拟长时间计算的任务),并返回一个CompletableFuture。通过thenAccept方法可以注册一个回调函数,在任务完成时执行。这里还演示了如何使用get()方法获取结果,但请注意,使用get()会阻塞当前线程。

  2. 组合多个异步任务

    CompletableFuture允许组合多个异步任务,这对复杂的异步场景非常有用。以下示例展示了如何组合两个异步任务:

    package cn.juwatech.async;import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutionException;public class CompletableFutureCombine {public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new IllegalStateException(e);}return "任务1结果";});CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {throw new IllegalStateException(e);}return "任务2结果";});CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> {return result1 + " & " + result2;});System.out.println("组合结果: " + combinedFuture.get());}
    }
    

    在这个示例中,thenCombine方法用于将两个CompletableFuture的结果合并成一个新的结果。这个模式在需要等待多个任务完成后再进行下一步处理的场景非常有用。

  3. 异常处理

    异步操作中异常处理是不可避免的。CompletableFuture提供了exceptionally方法,可以在任务出现异常时执行指定的回调:

    package cn.juwatech.async;import java.util.concurrent.CompletableFuture;public class CompletableFutureExceptionHandling {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {if (true) {throw new RuntimeException("模拟异常");}return "成功";});future.exceptionally(ex -> {System.out.println("发生异常: " + ex.getMessage());return "默认值";}).thenAccept(result -> System.out.println("最终结果: " + result));}
    }
    

    通过exceptionally,我们可以在发生异常时执行回调并提供一个默认值,这样可以避免异常导致应用崩溃。

二、Reactive Programming实战

Reactive Programming是一种响应式编程模式,专注于数据流和变化的传播。Java中的Reactive Programming通常使用Reactor或者RxJava库实现。

  1. Reactor框架简介

    Reactor是一个基于Reactive Streams规范的库,广泛应用于Spring WebFlux等异步应用中。以下是使用Reactor的简单示例:

    package cn.juwatech.reactive;import reactor.core.publisher.Flux;public class ReactorExample {public static void main(String[] args) {Flux<String> flux = Flux.just("Hello", "Reactive", "Programming").map(String::toUpperCase).filter(word -> word.length() > 5);flux.subscribe(System.out::println);}
    }
    

    在这个示例中,Flux用于表示一个包含多个元素的数据流。我们可以使用mapfilter等操作符来对数据流进行处理。subscribe方法用于订阅数据流,从而触发流的执行。

  2. 异步处理与背压

    Reactive Programming的一个重要特性是背压(Backpressure),用于控制数据生产者与消费者之间的速度匹配。下面是一个包含背压处理的示例:

    package cn.juwatech.reactive;import reactor.core.publisher.Flux;
    import reactor.core.scheduler.Schedulers;public class BackpressureExample {public static void main(String[] args) {Flux<Integer> numbers = Flux.range(1, 100).log().publishOn(Schedulers.boundedElastic()).limitRate(10); // 背压策略:限制每次请求的元素数量numbers.subscribe(data -> {try {Thread.sleep(100); // 模拟慢速处理System.out.println("处理数据: " + data);} catch (InterruptedException e) {e.printStackTrace();}},error -> System.err.println("发生错误: " + error),() -> System.out.println("处理完成"));}
    }
    

    这个示例中,limitRate(10)用于限制每次从生产者请求的元素数量,模拟背压的应用场景。通过publishOn(Schedulers.boundedElastic())将数据流的执行调度到一个弹性线程池上,以非阻塞的方式处理数据。

  3. 与Spring WebFlux集成

    Spring WebFlux是Spring 5引入的响应式Web框架,可以使用Reactor进行异步处理。下面是一个简单的控制器示例:

    package cn.juwatech.webflux;import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Mono;@RestController
    public class ReactiveController {@GetMapping("/hello")public Mono<String> sayHello() {return Mono.just("Hello, WebFlux!").map(String::toUpperCase);}
    }
    

    这个控制器使用了Reactor的Mono类型,表示一个包含单个元素的异步数据流。通过Mono.just创建数据流,并使用map操作符对数据进行处理。最终,Spring WebFlux会自动将Mono转换为HTTP响应。

总结

通过CompletableFuture和Reactive Programming,Java开发者可以在不同场景下实现异步编程,从而提高应用的性能和响应速度。在选择使用哪种异步编程模式时,可以根据项目需求和开发团队的技术栈做出决定。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

相关文章:

Java中的异步编程模式:CompletableFuture与Reactive Programming的实战

Java中的异步编程模式&#xff1a;CompletableFuture与Reactive Programming的实战 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在现代Java开发中&#xff0c;异步编程已经成为提高应用性能和…...

7iDU AMP田岛绣花机驱动器维修0J2100400022

7iDU AMP神州田岛绣花机驱动器维修0J2101300000绣花机控制器等全系列型号均可处理。 田岛7iDU AMP是田岛绣花机中使用很广的一种5相驱动器&#xff0c;在田岛平绣车TMEF-H&#xff0c;TMFD中应用&#xff0c;在链条车TMCE112S&#xff0c;和盘带车TMLG中大量使用。其采用的东芝…...

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…...

vue websocket 使用

基于webSocket通信的库主要有 socket.io&#xff0c;SockJS 关于SockJS的使用 先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs import SockJS from sockjs-client; import Stomp from stompjs; export default { data () { …...

Spring Boot 入门面试五道题

在准备Spring Boot面试时&#xff0c;从简单到困难设计面试题可以帮助你系统地复习和评估自己的掌握程度。以下是五个不同难度的Spring Boot面试题&#xff1a; 1. 简单题&#xff1a;什么是Spring Boot&#xff1f;它主要解决了什么问题&#xff1f; 答案&#xff1a; Sprin…...

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)

文章目录 前言一、ArkTS基本介绍1、 ArkTS组成2、组件参数和属性2.1、区分参数和属性的含义2.2、父子组件嵌套 二、装饰器语法1.State2.Prop3.Link4.Watch5.Provide和Consume6.Observed和ObjectLink代码示例&#xff1a;示例1&#xff1a;&#xff08;不使用Observed和ObjectLi…...

国产品牌 KTH1701系列 高性能、低功耗、全极磁场检测霍尔开关传感器

国产品牌 KTH1701系列 高性能、低功耗、全极磁场检测霍尔开关传感器 概述&#xff1a; KTH1701 是一款低功耗霍尔开关传感器&#xff0c;专为空间紧凑系统和电池电量敏感系统而设计。该芯片可以提供多种磁场阈值、开关工作频率和封装形式以适配各种应用。 当施加的S 极或 N 极…...

如何不终止容器退出Docker Bash会话

如何不终止容器退出Docker Bash会话 💖The Begin💖点点关注,收藏不迷路💖 当通过docker exec进入Docker容器的bash会话后,如果想退出但不停止容器,可以使用快捷键组合: 按下Ctrl+P然后紧接着按下Ctrl+Q。 这个操作会让你从bash会话中“分离”出来,但容器会继续运行…...

杰理芯片各型号大全,方案芯片推荐—云信通讯

29₤vFG537sTUWr《 https://s.tb.cn/h.gJ4LjAH CZ0016 杰理芯片 杰理芯片各型号大全&#xff0c;方案芯片推荐 https://shop.m.taobao.com/shop/shopIndex.htm?shop_id498574364&bc_fl_srctbsms_crm_3928605685_deliver$2553947245685_10973444242...

解决服务器首次请求异常耗时问题

1. 问题描述 在我们的图像识别API服务中,我们遇到了一个棘手的问题:服务器在首次接收请求时,响应时间异常地长,经常导致超时错误。这不仅影响了用户体验,还可能导致系统不稳定。 现象: 测试接口在首次调用时出现超时后续请求则能正常响应复现方法: 只需在服务重启后或长时间…...

VS code 创建与运行 task.json 文件

VS code 创建与运行 task.json 文件 引言正文创建 .json 文件第一步第二步第三步 运行 .json 文件 引言 之前在 VS code EXPLORER 中不显示指定文件及文件夹设置&#xff08;如.pyc, pycache, .vscode 文件&#xff09; 一文中我们介绍了 settings.json 文件&#xff0c;这里我…...

【电商API接口定价】618品牌定价参考(电商API接口数据采集)

价格是618狂欢节最为核心的存在&#xff0c;定价也成为品牌至关重要的环节。为了制定合理的价格策略&#xff0c;品牌和商家可以利用电商API接口进行数据采集&#xff0c;以获取更准确的市场信息和竞争态势。而电商API究竟可以帮助品牌如何定价呢&#xff1f; 首先&#xff0c;…...

PyRFC 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定

Asynchronous, non-blocking SAP NetWeaver RFC SDK bindings for Python. 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定 Call for Maintainers This project is currently looking for new maintainers. Please see this issue for details. Features Client …...

解决matplotlib画中文时缺乏中文字体问题。

https://www.cnblogs.com/oboth-zl/p/15152508.html 手动安装字体&#xff1a; Debian 和 Ubuntu 下对中文支持比较好的字体有&#xff1a; fonts-droid、ttf-wqy-zenhei 和 ttf-wqy-microhei 等&#xff0c;除了文泉驿系列字体外&#xff0c;比较流行的免费中文字体还有文鼎提…...

小琳AI课堂 掌握强化学习:探索OpenAI Gym的魅力与Python实战

大家好&#xff0c;这里是小琳AI课堂。今天我们来聊聊OpenAI Gym&#xff0c;一个强大的强化学习&#xff08;Reinforcement Learning, RL&#xff09;工具包。&#x1f31f; OpenAI Gym&#xff0c;由人工智能研究实验室OpenAI创建&#xff0c;为强化学习的研究和开发提供了一…...

1.3 等价类划分法

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 单功能2 等价划分法3 测试步骤3.1 分析需求3.2 设计测试点3.3 将测试点转为可执行用例文档3.4 执行测试3.5 缺陷管理 前言 在现代软件开发中&#xff0c;确保核心功能的有效性…...

概率论原理精解【15】

文章目录 可数性与可分性第二可数空间第二可数空间的定义第二可数空间的性质第二可数空间的例子第二可数空间的例题&#xff08;理论性质证明&#xff09;其它性质深入理解第二可数空间 可分空间可分空间的定义可分空间的性质可分空间的例子可分空间的例题在可分空间中&#xf…...

【新手上路】衡石分析平台系统管理手册-安全管理

安全策略​ 安全策略是针对系统中所有用户进行的安全控制&#xff0c;只有系统管理员可以设置。 打开设置->安全策略页面。 登录安全策略​ 启用复杂密码​ 启用之后&#xff0c;用户修改密码时&#xff0c;必须输入符合要求的复杂密码。 密码90天失效​ 密码的有效期…...

【Matlab】matlab 结构体使用方法

在 MATLAB 中&#xff0c;结构体&#xff08;struct&#xff09;是一种能够将不同类型和大小的数据组合在一起的容器。它允许你将数据分配给命名的字段&#xff08;fields&#xff09;&#xff0c;每个字段可以存储不同的数据类型&#xff0c;如数值、字符串、数组、矩阵等。以…...

Mamba YOLO World

论文地址&#xff1a;https://arxiv.org/pdf/2409.08513v1 代码地址&#xff1a; GitHub - Xuan-World/Mamba-YOLO-World: Mamba-YOLO-World: Marrying YOLO-World with Mamba for Open-Vocabulary Detection 开集检测&#xff08;OVD&#xff09;旨在检测预定义类别之外的物体…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...