CompletableFuture 源码解析
为什么会出现回调地狱
那是因为大家想把外层方法拿到的结果值,直接传递给回调函数。
但是如果把外城拿到的结果值用一个变量存储起来,例如 Future. future 在外层方法拿不到结果时, 直接阻塞住。 等拿到外层方法的结果, 在传递给 回调函数.
回调地狱
ExecutorService executor = Executors.newFixedThreadPool(5);
ListeningExecutorService guavaExecutor = MoreExecutors.listeningDecorator(executor);
ListenableFuture<String> future1 = guavaExecutor.submit(() -> {//step 1System.out.println("执行step 1");return "step1 result";
});
ListenableFuture<String> future2 = guavaExecutor.submit(() -> {//step 2System.out.println("执行step 2");return "step2 result";
});
ListenableFuture<List<String>> future1And2 = Futures.allAsList(future1, future2);
Futures.addCallback(future1And2, new FutureCallback<List<String>>() {@Overridepublic void onSuccess(List<String> result) {System.out.println(result);ListenableFuture<String> future3 = guavaExecutor.submit(() -> {System.out.println("执行step 3");return "step3 result";});Futures.addCallback(future3, new FutureCallback<String>() {@Overridepublic void onSuccess(String result) {System.out.println(result);} @Overridepublic void onFailure(Throwable t) {}}, guavaExecutor);}@Overridepublic void onFailure(Throwable t) {}}, guavaExecutor);
CompletableFuture
ExecutorService executor = Executors.newFixedThreadPool(5);
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {System.out.println("执行step 1");return "step1 result";
}, executor);
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {System.out.println("执行step 2");return "step2 result";
});
cf1.thenCombine(cf2, (result1, result2) -> {System.out.println(result1 + " , " + result2);System.out.println("执行step 3");return "step3 result";
}).thenAccept(result3 -> System.out.println(result3));
CompletableFuture 原理分析
简单理解CompletableFuture 就是一个被观察者,或者理解为是一个结果容器, 因为它持有result,
这个result记录的这个Completable 的上游传递下来的结果。
同时拿到上游传递下来的结果后, 他会触发自身的stack中存储的回调函数执行, 让回调函数执行后, 回调函数把结果传递给下游的CompletableFuture 实现数据流的流动。
仅仅需要把Completure理解存储结果的容器
执行链是 Completion. 即 CompletableFuture 设置值完成后,需要调用完成的函数。