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

Java响应式编程

Java响应式编程是一种基于异步和非阻塞的编程范式,旨在处理现代应用中日益增长的高并发、海量数据以及低延迟需求。通过响应式编程,开发者能够以更加优雅和高效的方式编写能够应对这些挑战的应用程序。

Quick start

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class ReactiveExample {
    public static void main(String[] args) {
        // 使用Mono表示一个单一的值
        Mono<String> mono = Mono.just("Hello, Reactive World!");
        mono.subscribe(System.out::println);

        // 使用Flux表示多个值的序列
        Flux<Integer> flux = Flux.just(1, 2, 3, 4, 5);
        flux.map(i -> i * 2)
            .subscribe(System.out::println);
    }
}

在这里插入图片描述

体现被背压的例子

背压(Backpressure)是响应式编程中的一个重要概念,特别是在数据生产者和消费者之间的速率不匹配时尤为重要。当数据生产者的速度超过了消费者的处理能力时,背压机制允许消费者通知生产者减慢数据的发送速度,避免系统过载。

下面是一个简单的Java示例,展示了如何使用Reactor库中的 Flux 和背压机制。在这个例子中,我们将创建一个快速生产数据的 Flux,然后使用背压机制让消费者以更慢的速度处理这些数据。

import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
import java.time.Duration;

public class BackpressureExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个每隔10毫秒产生一个元素的Flux
        Flux<Long> fastProducer = Flux.interval(Duration.ofMillis(10))
                               .onBackpressureBuffer(10, 
                                	dropped -> System.out.println("Dropped: " + dropped))
                               .take(100);  // 仅处理前100个元素

        // 让消费者处理每个元素的速度慢于生产者
        fastProducer
            .publishOn(Schedulers.boundedElastic())  // 使用一个独立的线程来处理
            .doOnNext(item -> {
                try {
                    // 模拟慢速消费者,处理每个元素需要100毫秒
                    Thread.sleep(100);
                    System.out.println("Processed: " + item);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            })
            .subscribe();

        // 主线程等待所有元素处理完毕
        Thread.sleep(20000);
    }
}

在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/286476.html

相关文章:

  • JxBrowser 7.41.7 版本发布啦!
  • 力扣【416. 分割等和子集】详细Java题解(背包问题)
  • HarmonyOS应用开发快速入门
  • 使用Edu邮箱申请一年免费的.me域名
  • 复古壁纸中棕色系和米色系哪个更受欢迎?
  • Unity 粒子特效在UI中使用裁剪效果
  • 最高院关于背靠背条款最新批复
  • 《机器学习》—— OpenCV 对图片的各种操作
  • Flink CDC读取Mysql时,Decimal类型数据异常,变成了字符串(源码解析及解决方案)
  • 【Linux 从基础到进阶】Apache服务器搭建与优化
  • IDEA2023的激活与安装
  • Leetcode 257-二叉树的所有路径
  • 【Vue】router和route的区别
  • 不同材质的O型圈优缺点及其应用范围
  • 计算机网络端口
  • 《机器学习》 DBSCAN算法 原理、参数解析、案例实现
  • Flink窗口API使用教程
  • 2024年6月 青少年等级考试机器人实操真题二级
  • Web3常见概念
  • 系统分析师6:计算机网络
  • HTML学习笔记——用HTML记录学习过程5-全局属性
  • 如何用Java SpringBoot+Vue打造高效产品订单管理系统?
  • Markdown语法与Latex公式汇总
  • Linux网络:TCP UDP socket
  • Vue3: customRef自定义响应数据
  • Springboot + AOP + 注解做全局日志拦截并且排除敏感属性以及接口相应时间