什么作用?
引入CompletableFuture,对业务流程进行编排,降低依赖之间的阻塞。充分利用我们的CPU资源,不让我们的CPU资源大量浪费在阻塞等待上。
几种使用场景
根据CompletableFuture依赖数量,可以分为以下几类:零依赖、一元依赖、二元依赖和多元依赖。
以下的CompletableFuture都以CF简称。
一、零依赖
这里的零依赖指的发起异步不需要依赖其他异步任务的结果。所以直接使用CompletableFuture发起一个异步调用即可。
ExecutorService executor = Executors.newFixedThreadPool(5);
//1、使用runAsync或supplyAsync发起异步调用
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
return "result1";
}, executor);
二、一元依赖
这种情况就是一个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
三、二元依赖
这种情况就是指的依赖了两个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);
四、多元依赖
这种情况就是依赖了多个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";
});