CompleteFuture详解

该文章已生成可运行项目,

CompletableFuture

1、CompletableFuture是什么?

CompletableFuture是Java 8中引入的一个类,它实现了Future接口,用于表示异步计算的结果。与Future不同,CompletableFuture提供了更丰富的方法来处理计算过程中的异常、组合多个计算任务以及链式调用等。

CompletableFuture的定义:
在这里插入图片描述
CompletableFuture 实现了两个接口(如上图所示):Future、CompletionStage。 Future 表示异步计算的结果,CompletionStage用于表示异步执行过程中的一个步骤(Stage),这个步骤可能是由另外一个CompletionStage触发的,随着当前步骤的完成,也可能会触发其他一系列CompletionStage的执行。从而我们可以根据实际业务对这些步骤进行多样化的编排组合,CompletionStage接口正是定义了这样的能力,我们可以通过其提供的thenAppy、thenCompose等函数式编程方法来组合编排这些步骤。

2、为什么使用CompletableFuture?

2.1 Future的局限性

在Java8之前我们一般通过Future实现异步,Future用于表示异步计算的结果。

  • 只能通过get()阻塞或者isDone()轮询的方式获取结果。
  • 不支持设置回调方法,Java 8之前若要设置回调一般会使用guava的 ListenableFuture,回调的引入又会导致臭名昭著的回调地狱。
  • 不能将多个Future合并在一起。 假设你有多种不同的Future, 你想在它们全部并行完成后然后运行某个函数,Future很难独立完成这一需要。
  • 没有异常处理。 Future提供的方法中没有专门的API应对异常处理,还需要开发者自己手动异常处理。

下面将举例来说明,我们通过Future、ListenableFuture来实现异步回调:

例子:替换文章中的敏感词。

  1. 读取文章,step1
  2. 读取敏感词,step2
  3. 替换敏感词,step3

其中step3依赖step1、step2的结果。

public static void main(String[] args) {
   
   
    // 创建线程池
    ExecutorService executor = Executors.newFixedThreadPool(5);
    // 对ExecutorService进行装饰成为ListeningExecutorService,Future ==>ListenableFuture,使其具有监听任务执行状态的功能,并能进行回调
    ListeningExecutorService guavaExecutor = MoreExecutors.listeningDecorator(executor);

    // 读取文章,step1
    ListenableFuture<String> future1 = guavaExecutor.submit(CommonUtils::readArticle);
    // 读取敏感词,step2
    ListenableFuture<Map<String,String>> future2 = guavaExecutor.submit(CommonUtils::readWords);
    ListenableFuture<List<Object>> future1And2 = Futures.allAsList(future1, future2);
    // 执行step1、step2的回调
    Futures.addCallback(future1And2, new FutureCallback<List<Object>>() {
   
   
        @Override
        public void onSuccess(List<Object> result) {
   
   
            // step1、step2 执行完成,并获取结果
            String article = (String) result.get(0);
            Map<String,String> words = (Map<String, String>) result.get(1);
            // 替换敏感词,step3,并将结果回调打印出来
            ListenableFuture<String> future3 = guavaExecutor.submit(() -> CommonUtils.replace(article, words));
            Futures.addCallback(future3, new FutureCallback<String>() {
   
   
                @Override
                public void onSuccess(String result) {
   
   
                    CommonUtils.printTheadLog(result);
                }
                @Override
                public void onFailure(Throwable t) {
   
   }
            }, guavaExecutor);
        }
        @Override
        public void onFailure(Throwable t) {
   
   }
    }, guavaExecutor);
}

2.2 CompletableFuture的优势

CompletableFuture相对于Future具有以下的优势:

  • 为快速创建、链接依赖和结合多个Future提供了大量的便利方法。
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值