当前位置: 首页 > 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开发者可以在不同场景下实现异步编程,从而提高应用的性能和响应速度。在选择使用哪种异步编程模式时,可以根据项目需求和开发团队的技术栈做出决定。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TIOBE 编程指数 9 月排行榜公布 VB.Net第七
  • 【深度学习】(3)--损失函数
  • Numpy
  • Java后端性能监控:使用JMX与Java Mission Control的深入解析
  • ppt一键生成免费版软件有哪些?如何高效生成论文答辩?
  • Rust: AES 加密算法库
  • Springboot请求响应案例
  • Axure RP 9最新安装程序及汉化包下载(支持Win、Mac版,附下载安装教程)
  • 游戏如何对抗定制挂
  • MATLAB矩阵下标引用
  • C语言中的一些小知识(二)
  • 【C#】vs2022 .net8
  • 分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
  • 若依VUE项目安全kind-of postcss vite漏洞扫描和修复
  • 常见面试题之计算机网络
  • hexo+github搭建个人博客
  • k个最大的数及变种小结
  • Making An Indicator With Pure CSS
  • SpringCloud集成分布式事务LCN (一)
  • Vue 动态创建 component
  • 创建一种深思熟虑的文化
  • 从输入URL到页面加载发生了什么
  • 给github项目添加CI badge
  • 关于 Cirru Editor 存储格式
  • 技术发展面试
  • 前端工程化(Gulp、Webpack)-webpack
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我看到的前端
  • 项目管理碎碎念系列之一:干系人管理
  • 一个完整Java Web项目背后的密码
  • 因为阿里,他们成了“杭漂”
  • 用mpvue开发微信小程序
  • 大数据全解:定义、价值及挑战
  • #在 README.md 中生成项目目录结构
  • (13)DroneCAN 适配器节点(一)
  • (2)STM32单片机上位机
  • (poj1.2.1)1970(筛选法模拟)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (九)One-Wire总线-DS18B20
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)德国人的记事本
  • (转)详解PHP处理密码的几种方式
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 生成二级域名
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net反编译的九款神器
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET企业级应用架构设计系列之技术选型
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Autowired 和 @Resource 区别的补充说明与示例
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [20171113]修改表结构删除列相关问题4.txt