CompletableFuture的使用

什么作用?

引入CompletableFuture,对业务流程进行编排,降低依赖之间的阻塞。充分利用我们的CPU资源,不让我们的CPU资源大量浪费在阻塞等待上。

几种使用场景

根据CompletableFuture依赖数量,可以分为以下几类:零依赖、一元依赖、二元依赖和多元依赖。

以下的CompletableFuture都以CF简称。

一、零依赖

image.png

这里的零依赖指的发起异步不需要依赖其他异步任务的结果。所以直接使用CompletableFuture发起一个异步调用即可。

ExecutorService executor = Executors.newFixedThreadPool(5);
//1、使用runAsync或supplyAsync发起异步调用
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
  return "result1";
}, executor);

二、一元依赖

image.png

这种情况就是一个CF的调用依赖于另外一个CF的完成或者完成结果。

可以通过CF里面的thenApply、thenAccept、thenCompose等方法来实现

ExecutorService executor = Executors.newFixedThreadPool(5);
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("执行step 1");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "step1 result";
        }, executor);
        CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("执行step 2");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "step2 result";
        });

CompletableFuture<String> stringCompletableFuture = cf1.thenApply(result -> {
                System.out.println(result);
                return "123123";
            });
            String join = stringCompletableFuture.join();
            System.out.println(join);
##结果
//执行step 1
//执行step 2
//step1 result
//123123

三、二元依赖

image.png

这种情况就是指的依赖了两个CF的结果。

//方法体内的程序执行依赖cf1和cf2都执行完,并且把cf1和cf2的结果可以拿到
cf1.thenCombine(cf2, (result1, result2) -> {
            System.out.println(result1 + " , " + result2);
            System.out.println("执行step 3");
            return "step3 result";
        }).thenAccept(System.out::println);

四、多元依赖

image.png

这种情况就是依赖了多个CF的完成或者CF的结果

CompletableFuture<Void> cf6 = CompletableFuture.allOf(cf3, cf4, cf5);
CompletableFuture<String> result = cf6.thenApply(v -> {
  //这里的join并不会阻塞,因为传给thenApply的函数是在CF3、CF4、CF5全部完成时,才会执行 。
  result3 = cf3.join();
  result4 = cf4.join();
  result5 = cf5.join();
  //根据result3、result4、result5组装最终result;
  return "result";
});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容