CompletableFuture实际操作的源码追究

CompletableFuture实际操作的源码追究

在此之前整体框架:

  • Completion:封装了执行任务,以及该任务所依赖的其他任务的结果,在执行任务时进行不同的操作。
  • CompletableFuture:对任务结果的一些操作的封装,以及构建和处理Completion任务依赖的关系。

任务初始化:supplyAsync

    public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
   
        return asyncSupplyStage(ASYNC_POOL, supplier);
    }

asyncSupplyStage方法

asyncSupplyStage方法会返回一个CompletableFuture供我们使用。

    static <U> CompletableFuture<U> asyncSupplyStage(Executor e,
                                                     Supplier<U> f) {
   
        if (f == null) throw new NullPointerException();
        CompletableFuture<U> d = new CompletableFuture<U>();
        e.execute(new AsyncSupply<U>(d, f));
        return d;
    }

其实就是创建了一个AsyncSupply交由线程池进行异步处理。这里的AsyncSupply是一个ForkJoinTask,也是一个Completion

AsyncSupply类

    static final class AsyncSupply<T> extends ForkJoinTask<Void>
        implements Runnable, AsynchronousCompletionTask {
   
        CompletableFuture<T> dep; Supplier<? extends T> fn; // dep是本次任务的结果和有关依赖,fn是任务的执行逻辑
        AsyncSupply(CompletableFuture<T> dep, Supplier<? extends T> fn) {
   
            this.dep = dep; this.fn = fn;
        }

        public final Void getRawResult() {
    return null; }
        public final void setRawResult(Void v) {
   }
        public final boolean exec() {
    run(); return false; }

        public void run() {
   
            CompletableFuture<T> d; Supplier<? extends T> f;
            if ((d = dep) != null && (f = fn) != null) {
   
                dep = null; fn = null;
                if (d.result == null) {
   
                    try {
   
                        d.completeValue(f.get()); // <1>
                    } catch (Throwable ex) {
   
                        d.completeThrowable(ex);
                    }
                }
                d.postComplete();
            }
        }
    }

<1>执行任务fn.get,并将得到的结果封装到dep.resultresult会作为一个任务是否被执行过或是否完成的状态的判断。

后续处理操作:thenAccept

// CompletableFuture#thenAccept
public CompletableFuture<Void
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值