Day419.CompletableFuture 异步编排 -谷粒商城

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day419.CompletableFuture 异步编排 -谷粒商城相关的知识,希望对你有一定的参考价值。

CompletableFuture 异步编排

阿昌总结今天学习到的CompletableFuture

当我们在异步任务编程的时候,可能会有场景如下:

可能你会想到用之前我们学到的Callable的方式去获取结果后,再执行;

但是这样子不能保证是异步与异步之间的结果;

C不能感知到AB的结果后再异步执行;

所以,这里我们就引出了 CompletableFuture

一、前言

什么是CompletableFuture呢?

CompletableFuture 和 FutureTask 同属于 Future 接口的实现类,都可以获取线程的执行结果。


二、API

方法不以 Async 结尾,意味着 Action 使用相同的线程执行,而 Async 可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)

1、是否有返回值

()->

CompletableFuture future = CompletableFuture.XXXAsync(()->);
  • runXxxx都是没有返回结果

  • supplyXxx都是可以获取返回结果

  • 可以传入自定义的线程池,否则就用默认的线程池;


2、是否有回调方法,不能改变返回值

(t,error)->

只能返回结果,不能改变返回值

whenComplete 可以处理正常和异常的计算结果,exceptionally 处理异常情况。

  • whenComplete 和 whenCompleteAsync 的区别
    • whenComplete:是执行当前任务的线程执行继续执行 whenComplete 的任务。
    • whenCompleteAsync:是执行把 whenCompleteAsync 这个任务继续提交给线程池
      来进行执行。

3、有回调方法,能改变返回值

(t,error)->return xx;

只能返回结果,能改变返回值

和 complete 一样,可对结果做最后的处理(可处理异常),可改变返回值。


4、线程串行化方法

T:上一个任务返回结果的类型

U:当前任务的返回值类型

  • thenApply(resp->return xx;)
    • 当一个线程依赖另一个线程时,获取上一个任务返回的结果,并返回当前任务的返回值。
  • thenAccept(resp->)
    • 消费处理结果。接收任务的处理结果,并消费处理,无返回结果。
  • thenRun(()->)
    • 只要上面的任务执行完成,就开始执行 thenRun,只是处理完任务后,执行thenRun 的后续操作

带有 Async 默认是异步执行的。同之前

  • 以上都要前置任务成功完成。

5、两任务组合—都要完成

两个任务必须都完成,触发该任务。

下面的CompletableFuture为另一个任务

  • thenCombine(CompletableFuture,(r1,r2)->return xx;,线程池)

    • 组合两个 future,获取两个 future 的返回结果,并返回当前任务的返回值
    future01.thenCombineAsync(future02,(r1,r2)-return xx;,excutor);
    
  • thenAcceptBoth(CompletableFuture,(r1,r2)->,线程池)

    • 组合两个 future,获取两个 future 任务的返回结果,然后处理任务,没有返回值。
    future01.thenAcceptBothAsync(future02,(f1,f2)->,executor);
    
  • runAfterBoth(CompletableFuture,()->,线程池)

    • 组合两个 future,不需要获取 future 的结果,只需两个 future 处理完任务后,处理该任务。
    future01.runAfterBothAsync(future02,()->,executor);
    

6、两任务组合 - - 一个完成

当两个任务中,任意一个 future 任务完成的时候,执行任务。

下面的CompletableFuture为另一个任务

  • applyToEither(CompletableFuture,res->return xxx;,线程池)

    • 两个任务有一个执行完成,获取它的返回值,处理任务并有新的返回值。
    future01.applyToEitherAsync(future02,res->,executor);
    
  • acceptEither(CompletableFuture,res->,线程池):res为两个任务中执行完成的那个的返回值

    • 两个任务有一个执行完成,获取它的返回值,处理任务,没有新的返回值。
    future01.acceptEitherAsync(future02,res->,executor);
    
  • runAfterEither(CompletableFuture,()->,线程池)

    • 两个任务有一个执行完成,不需要获取 future 的结果,处理任务,也没有返回值。
    future01.runAfterEitherAsync(future02,()->,executor);
    

7、 多任务组合

  • allOf

    • 等待所有任务完成

  • anyOf

    • 只要有一个任务完成

以上是关于Day419.CompletableFuture 异步编排 -谷粒商城的主要内容,如果未能解决你的问题,请参考以下文章

自学it18大数据笔记-第一阶段Java-day09-day10-day11-day12-day13-day14-day15

自学it18大数据笔记-第一阶段Java-day16-day17-day18-day19--day20-day21-day22——会持续更新

伸手党福利文,Python入门大全

目录大纲

自学it18大数据笔记-第一阶段Java-day05-day06-day07-day08

day56(2023.4.25)