CompletableFuture使用场景和实现原理

本文介绍了Java中的CompletableFuture,它是jdk1.8引入的并发编程工具,扩展了Future和CompletionStage。CompletableFuture通过函数式编程提供异步回调功能,避免了传统Future的阻塞问题。文章详细探讨了为何引入CompletableFuture,如Netty的ChannelFuture的异步处理,并展示了CompletableFuture的主要功能,如转换、组合和消费等操作。同时,通过源码分析,揭示了CompletableFuture的创建、异步执行和依赖任务调度的内部机制,帮助读者深入理解其实现原理。
摘要由CSDN通过智能技术生成

1.概述

CompletableFuture是jdk1.8引入的实现类。扩展了Future和CompletionStage,是一个可以在任务完成阶段触发一些操作Future。简单的来讲就是可以实现异步回调。

2.为什么引入CompletableFuture

对于jdk1.5的Future,虽然提供了异步处理任务的能力,但是获取结果的方式很不优雅,还是需要通过阻塞(或者轮训)的方式。如何避免阻塞呢?其实就是注册回调。

业界结合观察者模式实现异步回调。也就是当任务执行完成后去通知观察者。比如Netty的ChannelFuture,可以通过注册监听实现异步结果的处理。

Netty的ChannelFuture
public Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener) {
   
    checkNotNull(listener, "listener");
    synchronized (this) {
   
        addListener0(listener);
    }
    if (isDone()) {
   
        notifyListeners();
    }
    return this;
}
private boolean setValue0(Object objResult) {
   
    if (RESULT_UPDATER.compareAndSet(this, null, objResult) ||
        RESULT_UPDATER.compareAndSet(this, UNCANCELLABLE, objResult)) {
   
        if (checkNotifyWaiters()) {
   
            notifyListeners();
        }
        return true;
    }
    return false;
}

通过addListener方法注册监听。如果任务完成,会调用notifyListeners通知。

CompletableFuture通过扩展Future,引入函数式编程,通过回调的方式去处理结果。

3.功能

CompletableFuture的功能主要体现在他的CompletionStage。

可以实现如下等功能

  • 转换(thenCompose)
  • 组合(thenCombine)
  • 消费(thenAccept)
  • 运行(thenRun)。
  • 带返回的消费(thenApply)

消费和运行的区别
消费使用执行结果。运行则只是运行特定任务。具体其他功能大家可以根据需求自行查看。

CompletableFuture借助CompletionStage的方法可以实现链式调用。并且可以选择同步或者异步两种方式。

这里举个简单的例子来体验一下他的功能。

public static void thenApply() {
   
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    CompletableFuture cf = CompletableFuture.supplyAsync(() -> {
   
        try {
   
            //  Thread.sleep(2000);
        } catch (Exception e) {
   
            e.printStackTrace();
        }
        System.out.println("supplyAsync " + Thread.currentThread().getName());
        return "hello"</
CompletableFuture是Java 8引入的一个类,用于支持异步编程和处理异步任务的结果。它提供了一种简洁而强大的方式来处理异步操作,并且可以方便地进行组合和链式调用。 CompletableFuture的底层原理主要基于两个概念:Future和Promise。 1. FutureFuture是一个接口,用于表示一个异步计算的结果。它提供了一些方法来检查计算是否完成、等待计算完成并获取结果等。但是,Future的局限性在于它无法手动设置计算结果,只能通过异步任务的执行线程来设置。 2. Promise:Promise是一个接口,继承自Future,它扩展了Future的功能,允许手动设置计算结果。Promise提供了一些方法来设置计算结果、处理异常等。 CompletableFuture在底层使用了Promise的实现来实现异步任务的处理。它通过将任务的执行和结果的设置解耦,使得任务的执行线程可以独立于结果的设置线程。这样可以更灵活地处理异步任务,并且可以方便地进行组合和链式调用。 具体来说,CompletableFuture使用了一种称为"CompletionStage"的机制来处理异步任务的结果。CompletionStage是一个接口,它定义了一系列方法来处理异步任务的结果,包括对结果进行转换、组合、处理异常等。 CompletableFuture实现了CompletionStage接口,并提供了一些额外的方法来支持更丰富的异步编程场景。它可以通过调用一系列的方法来组合和链式调用多个异步任务,实现复杂的异步操作。 总结一下,CompletableFuture底层原理主要基于Future和Promise的概念,通过使用CompletionStage机制来处理异步任务的结果,提供了一种简洁而强大的方式来支持异步编程和处理异步任务的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值