石家庄外贸网站推广,wordpress 经典主题,本钢建设公司官网,wordpress导航菜单修改目录 前言1. 基本知识2. Demo3. 实战 前言
Java基本知识#xff1a;
java框架 零基础从入门到精通的学习路线 附开源项目面经等#xff08;超全#xff09;【Java项目】实战CRUD的功能整理#xff08;持续更新#xff09;
1. 基本知识
CompletableFuture 是 Java 8 引…目录前言1. 基本知识2. Demo3. 实战前言Java基本知识java框架 零基础从入门到精通的学习路线 附开源项目面经等超全【Java项目】实战CRUD的功能整理持续更新1. 基本知识CompletableFuture 是 Java 8 引入的异步编程类属于 java.util.concurrent 包的一部分异步计算async computation事件驱动callback任务组合composition异常处理exception handling核心思想是非阻塞地执行任务并在任务完成后处理结果核心特性非阻塞与 Future.get() 阻塞不同CompletableFuture 可以通过回调非阻塞地处理结果链式调用可以通过方法链组合多个异步任务异常处理提供 exceptionally、handle 等方法处理异常线程池支持可以指定 Executor 来控制异步任务执行线程常用的方法总结如下方法类型功能描述注意事项runAsync(Runnable)创建异步执行无返回值任务默认使用 ForkJoinPool.commonPool()任务无返回值supplyAsync(SupplierU)创建异步执行有返回值任务默认使用 ForkJoinPool.commonPool()thenApply(Function? super T,? extends U)转换对结果进行处理并返回新值上一个任务异常时不执行thenAccept(Consumer? super T)消费对结果进行消费无返回值上一个任务异常时不执行thenRun(Runnable)消费上一个任务完成后执行无结果传递上一个任务异常时不执行thenCompose(Function? super T,? extends CompletionStageU)组合链式异步调用顺序依赖可以避免嵌套CompletableFuturethenCombine(CompletionStage? extends U, BiFunction? super T,? super U,? extends V)组合两个独立异步任务完成后合并结果两个任务都完成才执行thenAcceptBoth(CompletionStage? extends U, BiConsumer? super T,? super U)组合两个独立任务完成后消费结果无返回值runAfterBoth(CompletionStage? , Runnable)组合两个独立任务完成后执行无结果传递无返回值allOf(CompletableFuture?...)等待等待所有任务完成返回CompletableFutureVoid需自行获取每个结果anyOf(CompletableFuture?...)等待任意一个任务完成即可返回CompletableFutureObject需强转类型exceptionally(FunctionThrowable,? extends T)异常处理捕获异常并返回默认值上游异常时触发handle(BiFunction? super T, Throwable, ? extends U)异常处理对结果或异常处理无论异常与否都会执行whenComplete(BiConsumer? super T,? super Throwable)异常处理对结果或异常进行观察无返回值类似finally核心方法创建supplyAsync(), runAsync()链式处理thenApply(), thenAccept(), thenRun()组合thenCompose(), thenCombine(), allOf(), anyOf()异常处理exceptionally(), handle()2. Demo示例 1异步任务执行publicstaticvoiddemoRunAsync(){CompletableFuture.runAsync(()-{System.out.println(执行任务: Thread.currentThread().getName());}).join();}示例 2有返回值异步任务publicstaticvoiddemoSupplyAsync(){intresultCompletableFuture.supplyAsync(()-{return42;}).thenApply(x-x*2).join();System.out.println(结果: result);}示例 3组合两个任务publicstaticvoiddemoThenCombine(){CompletableFutureIntegerf1CompletableFuture.supplyAsync(()-10);CompletableFutureIntegerf2CompletableFuture.supplyAsync(()-20);intsumf1.thenCombine(f2,Integer::sum).join();System.out.println(组合结果: sum);}示例 4异常处理publicstaticvoiddemoExceptionally(){CompletableFutureIntegerfutureCompletableFuture.supplyAsync(()-{if(true)thrownewRuntimeException(出错了);return100;});intresultfuture.exceptionally(ex-{System.out.println(捕获异常: ex.getMessage());return-1;}).join();System.out.println(最终结果: result);}示例 5等待多个任务完成publicstaticvoiddemoAllOf(){CompletableFutureIntegerf1CompletableFuture.supplyAsync(()-10);CompletableFutureIntegerf2CompletableFuture.supplyAsync(()-20);CompletableFutureIntegerf3CompletableFuture.supplyAsync(()-30);CompletableFutureVoidallCompletableFuture.allOf(f1,f2,f3);all.join();// 等待所有任务完成intsumf1.join()f2.join()f3.join();System.out.println(总和: sum);}大的一个Demoimportjava.util.concurrent.*;publicclassCompletableFutureDemo{publicstaticvoidmain(String[]args)throwsException{ExecutorServiceexecutorExecutors.newFixedThreadPool(3);// 异步任务1CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-{System.out.println(任务1执行线程: Thread.currentThread().getName());return10;},executor);// 异步任务2CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-{System.out.println(任务2执行线程: Thread.currentThread().getName());return20;},executor);// 组合任务任务1和任务2完成后求和CompletableFutureIntegerresultFuturefuture1.thenCombine(future2,(a,b)-ab);// 处理结果和异常resultFuture.thenAccept(sum-System.out.println(结果: sum)).exceptionally(ex-{System.out.println(异常ex.getMessage());returnnull;});// 等待所有任务完成resultFuture.join();executor.shutdown();}}截图如下3. 实战之所以有这个知识点是因为我原先的异步写错了导致有这个总结的思路上述意思如下线程A 算法1算法2算法3实际应该如下线程A算法1线程B算法2线程C算法3实际如下:AI 算法A→FutureTaskResultAI 算法B→FutureTaskResultAI 算法C→FutureTaskResult↓ allOf 等待 ↓ 汇总结果给前端大致的Demo如下:publicclassAiRecognition{publicstaticStringTOKENxxx;// 线程池生产环境建议交给 Spring 管理privatestaticfinalExecutorServiceEXECUTORExecutors.newFixedThreadPool(3);/** * 三个 AI 算法并发识别 */publicstaticCompletableFutureAiCheckResultaiCheckAll(StringimgUrlF,StringimgUrlL,StringimgUrlI){CompletableFutureTaskResultcontainerFutureCompletableFuture.supplyAsync(()-safeContainerCheck(imgUrlF),EXECUTOR);CompletableFutureTaskResultdoorFutureCompletableFuture.supplyAsync(()-safeDoorCheck(imgUrlL),EXECUTOR);CompletableFutureTaskResultinnerFutureCompletableFuture.supplyAsync(()-safeInnerCheck(imgUrlI),EXECUTOR);returnCompletableFuture.allOf(containerFuture,doorFuture,innerFuture).thenApply(v-{ListTaskResultlistArrays.asList(containerFuture.join(),doorFuture.join(),innerFuture.join());AiCheckResultresultnewAiCheckResult();result.setDetails(list);result.setSuccess(list.stream().allMatch(TaskResult::isSuccess));returnresult;});}// 以下是单个算法的安全封装 privatestaticTaskResultsafeContainerCheck(StringimgUrl){try{StringdatauploadImageAndRecognize(imgUrl,http://xxxx);returnTaskResult.ok(containerNumber,data);}catch(Exceptione){returnTaskResult.fail(containerNumber,e.getMessage());}}privatestaticTaskResultsafeDoorCheck(StringimgUrl){try{StringdatauploadImageAndGetState(imgUrl,http://xxxx);returnTaskResult.ok(doorState,data);}catch(Exceptione){returnTaskResult.fail(doorState,e.getMessage());}}privatestaticTaskResultsafeInnerCheck(StringimgUrl){try{StringdatauploadImageAndGetState(imgUrl,http://xxxx);returnTaskResult.ok(innerState,data);}catch(Exceptione){returnTaskResult.fail(innerState,e.getMessage());}}}1️⃣ 定义单个算法的返回结果publicclassTaskResult{privateStringtaskName;privatebooleansuccess;privateStringdata;privateStringreason;publicstaticTaskResultok(StringtaskName,Stringdata){TaskResultrnewTaskResult();r.taskNametaskName;r.successtrue;r.datadata;returnr;}publicstaticTaskResultfail(StringtaskName,Stringreason){TaskResultrnewTaskResult();r.taskNametaskName;r.successfalse;r.reasonreason;returnr;}// getter / setter 省略}2️⃣ 汇总返回给前端的结果publicclassAiCheckResult{privatebooleansuccess;privateListTaskResultdetails;// getter / setter}