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

CompleteableFuture异步编程框架

一、CompleteableFuture

CompleteableFuture是Java 8中的一个类,它提供了一种异步编程的方式。使用CompleteableFuture可以提高程序的并发性和性能。

二、案例引出

2.1 案例代码

  1. 目录结构
    在这里插入图片描述

  2. 有3个被调用的service(MemberService,OrderService,ProductService),每个service中有个search方法,分别耗时5,4,3秒钟。
    在这里插入图片描述

  3. 测试代码,需要计算查询需求的总体耗时
    在这里插入图片描述

2.2 引出CompleteableFuture异步调用

有一个查询需求,需要分别调用这3个service的search方法,获取对应会员、订单、产品列表。这3个调用的返回结果之间没有依赖关系。

  1. 串行调用
    public void query1(){
        List<Member> members = memberService.search();
        List<Order> orders = orderService.search();
        List<Product> products = productService.search();
    }

耗时为3+4+5=12秒

在这里插入图片描述

  1. 并行调用–也就是异步调用
    public void query2() throws ExecutionException, InterruptedException {
        CompletableFuture<List<Member>> memberFuture = CompletableFuture.supplyAsync(() -> memberService.search());
        CompletableFuture<List<Order>> orderFuture = CompletableFuture.supplyAsync(() -> orderService.search());
        CompletableFuture<List<Product>> productFuture = CompletableFuture.supplyAsync(() -> productService.search());
        CompletableFuture.allOf(memberFuture,orderFuture,productFuture).get();
    }

耗时为max{5,4,3}=5秒

在这里插入图片描述

三、CompletableFuture常用方法

1. supplyAsync( )

开启一个异步调用,并返回一个CompletableFuture对象

    public void query2(){
        CompletableFuture<List<Member>> memberFuture = CompletableFuture.supplyAsync(() -> memberService.search());
        CompletableFuture<List<Order>> orderFuture = CompletableFuture.supplyAsync(() -> orderService.search());
        CompletableFuture<List<Product>> productFuture = CompletableFuture.supplyAsync(() -> productService.search());
    }

在这里插入图片描述

2. runAsync( )

    public void query2(){
        CompletableFuture.runAsync(() -> memberService.search());
        CompletableFuture.runAsync(() -> orderService.search());
        CompletableFuture.runAsync(() -> productService.search());
    }

在这里插入图片描述

3. get( )

阻塞式地获取一个CompletableFuture对象的结果,抛出ExecutionException, InterruptedException异常

    public void query2() throws ExecutionException, InterruptedException {
        CompletableFuture<List<Member>> memberFuture = CompletableFuture.supplyAsync(() -> memberService.search());
        List<Member> members = memberFuture.get();
    }

在这里插入图片描述

4.链式调用–thenApply( )

返回的结果如果是CompletableFuture,可以继续调用相关api

thenApply( )方法:前面任务执行完后执行当前任务。消费上一次调用的结果,返回另一个结果

    public void query2() throws ExecutionException, InterruptedException {
        CompletableFuture<List<Order>> future = CompletableFuture.supplyAsync(() -> memberService.search())
                .thenApply(lastResult -> orderService.search());
        List<Order> orders = future.get();
    }

在这里插入图片描述

5. thenRun( )

前面任务执行完后执行当前任务。不管上一次调用的结果是什么,没有参数,没有返回值

    public void query2() throws ExecutionException, InterruptedException {
        CompletableFuture.supplyAsync(() -> memberService.search())
                .thenRun(() -> orderService.search());
    }

在这里插入图片描述

6. thenAccept( )

前面任务执行完后执行当前任务。消费上一次调用的结果,没有返回值

    public void query2() throws ExecutionException, InterruptedException {
        CompletableFuture.supplyAsync(() -> memberService.search())
                .thenAccept(lastResult -> orderService.search());
    }

在这里插入图片描述

7. anyOf( )

将多个future对象合并,返回最早运行结束的对象

    public void query2() throws ExecutionException, InterruptedException {
        CompletableFuture<List<Member>> memberFuture = CompletableFuture.supplyAsync(() -> memberService.search());
        CompletableFuture<List<Order>> orderFuture = CompletableFuture.supplyAsync(() -> orderService.search());
        CompletableFuture<List<Product>> productFuture = CompletableFuture.supplyAsync(() -> productService.search());
        CompletableFuture<Object> future = CompletableFuture.anyOf(memberFuture, orderFuture, productFuture);
        System.out.println(future.get());
    }

在这里插入图片描述

8. allOf( )

等待所有并行任务执行后,再执行后面的操作。
allOf( ):返回CompletableFuture<Void>对象,本身并不会阻塞

示例:等待memberService和orderService都结束后,再执行后面的异步操作。

    public void query2(){
        long a = System.currentTimeMillis();
        CompletableFuture<List<Member>> memberFuture = CompletableFuture.supplyAsync(() -> memberService.search());
        CompletableFuture<List<Order>> orderFuture = CompletableFuture.supplyAsync(() -> orderService.search());

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(memberFuture, orderFuture);
        allFutures.thenRun(()->{
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            long b = System.currentTimeMillis();
            System.out.println("耗时111:"+(b-a));
        });
    }

在这里插入图片描述


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

相关文章:

  • 【知识科普】微内核架构与宏内核架构
  • 电子应用产品设计方案-9:全自动智能马桶系统设计方案
  • 文献阅读 | Nature Communications:使用自适应图注意自动编码器从空间解析的转录组学中解读空间域
  • 学习threejs,使用TWEEN插件实现动画
  • 栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)
  • 数据库的性能优化 -- SQL性能优化
  • [linux基础知识]创建新用户并使用该用户
  • 【2024数学建模国赛赛题解析已出】原创免费分享
  • 神经网络中激活函数介绍、优缺点分析
  • 何为图像处理,有哪些处理方法
  • AGV行业遇冷,叉车AGV逆风崛起:180家企业掀起血战
  • linux中vim常用命令大全详细讲解
  • 几乎每一位面试官都会关注的能力,你做到了吗?
  • Linux 磁盘管理-终于把fdisk命令创建分区挂讲明白了
  • 优化芋道后台菜单管理卡顿问题element-plus版本
  • WPS Office for Linux 12 个人版上线deepin 23商店:UI 视觉重构,新增多项 AI 功能
  • Kafka如何保证消息不丢失?
  • win11环境android studio中AVD目录修改问题解决
  • 青岛实训 8月21号 day33
  • Type-C接口上的DisplayPort
  • 【直播原理大揭秘】世预赛18强国足直播瞬时流量过大,爱奇艺为此道歉
  • 产品经理入门基础
  • 红外小目标检测:基于深度学习
  • Spark常见面试题整理
  • 二进制基础和STM32的常用位运算
  • YOLOv8 classify介绍