简单介绍一下CompletableFuture,从最简单的用法介绍,

简单介绍一下CompletableFuture,从最简单的用法介绍, 文章目录1. 最简单的创建方式提交一个异步任务2. 升级玩法做完一件事自动做下一件事链式调用thenApply —— 转换结果thenAccept —— 消费结果3. 应对意外异常处理核心总结在 Java 的并发编程中CompletableFuture就像是一个承诺Promise。它代表了一个异步计算的结果这个结果现在可能还没好但等会儿好了它会自动通知你或者直接帮你执行下一步。在它出现之前Java 8 之前我们用Future但它有个致命的大坑——你必须死等它结束调用.get()会阻塞线程或者不停地去轮询。而CompletableFuture彻底解放了我们让我们可以用链式调用写出优雅的异步代码。1. 最简单的创建方式提交一个异步任务如果你只是想把一个耗时的任务扔到后台去执行不想卡住主线程最常用的是runAsync无返回值和supplyAsync有返回值。importjava.util.concurrent.CompletableFuture;publicclassSimpleDemo{publicstaticvoidmain(String[]args)throwsException{// 1. 扔一个有返回值的异步任务给后台默认在 ForkJoinPool 线程池执行CompletableFutureStringfutureCompletableFuture.supplyAsync(()-{try{Thread.sleep(2000);}catch(InterruptedExceptione){}// 模拟耗时 2 秒return做好了;});System.out.println(主线程继续做别的事...);// 2. 强行获取结果这步会阻塞直到后台做完Stringresultfuture.get();System.out.println(拿到结果: result);}}2. 升级玩法做完一件事自动做下一件事链式调用CompletableFuture最厉害的地方在于你可以像接水管一样把好几个步骤串联起来。前一步的结果会自动传给下一步。thenApply—— 转换结果收到上一步的结果处理一下再返回一个新结果。CompletableFuture.supplyAsync(()-hello).thenApply(result-result world)// 收到 hello加工成 hello world.thenApply(String::toUpperCase)// 收到 hello world变成大写.thenAccept(System.out::println);// 最终打印: HELLO WORLDthenAccept—— 消费结果收到上一步的结果把它用掉没有返回值通常作为链路的终点。CompletableFuture.supplyAsync(()-外卖到了).thenAccept(food-System.out.println(开吃: food));3. 应对意外异常处理异步代码最怕执行到一半悄悄报错你还不知道。CompletableFuture提供了很温柔的异常捕获机制exceptionally。它就像try-catch如果前面任何一步崩了都会掉进这里并且可以给一个兜底的默认值。CompletableFuture.supplyAsync(()-{if(true){thrownewRuntimeException(厨房着火了);}return做好的菜;}).exceptionally(ex-{System.out.println(发生异常: ex.getMessage());return方便面兜底方案;// 报错了就吃方便面}).thenAccept(food-System.out.println(最终食物: food));核心总结你可以把它的常用 API 分成三类来记动作类型API 命名规律特点开启任务supplyAsync(...)/runAsync(...)把任务扔进后台线程池接续处理thenApply(...)拿到上一步的结果加工并返回新结果收尾消费thenAccept(...)拿到上一步的结果消费掉不返回新结果救场兜底exceptionally(...)前面出错时触发返回一个安全的兜底值