原创

completableFuture

温馨提示:
本文最后更新于 2025年07月19日,已超过 329 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

常用API

名字有无返回值是否可以使用自定义线程池
runAsync
supplyAsync

whenComplete 当上一步结束的时候,会自动执行 此处的代码

exceptionlly   当出现异常时,用来捕获异常

completableFuture 的常用方法


  • 获得结果和触发计算

get():不见不散

get(long timeout,TimeUnit unit):过时不候

join():

getNow():获取结果,计算完成,返回计算结果,未完成,则返回 给定值

complete(): 是否打断get方法立即返回括号值。 true 打断get方法,未完成,false  未打断get方法,完成计算。

  • 对结果进行处理

thenAppay: 计算结果存在依赖关系,两个线程串行化->当前步骤出错,不继续下一步

handle:计算结果存在依赖关系,两个结果串行化-->有异常的步骤不运算,其他的都进行运算

  • 对计算结果进行消费

thenAccept:接收任务的处理结果,并消费处理,无返回结果。任务A执行完执行B,B需要A的结果,B无返回值。

thenRun:任务A执行完执行B,B不需要A的结果。

thenApply:任务A执行完执行B,B需要A的结果,同时B有返回值。

  • 对计算速度进行选用

applyToEither:谁快用谁。

使用2个completableFure任务,然后使用 playA.applyToEither(playB,f->{})。此时会使用耗时最短的线程进行运算。

  • 对计算结果进行合并

thenComebine:两个任务后完成后,最终一起处理。先完成,需要等待其他任务完成。

       CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            return 1;
        });
        CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            return 3;
        });

        CompletableFuture<Integer> future = completableFuture1.thenCombine(completableFuture2, (v1, v2) -> {
           
            return v1 + v2;
        });
        System.out.println("--------- future = " + future.join());

completableFurure和线程池

thenRun和thenRunAsync区别

不传入线程池,默认使用 ForkJoin线程池。

传入线程池,thenRun保持上一步骤的线程池,thenRunAsync使用ForkJoin线程池

备注:有可能处理太快,系统优化原则,直接使用main线程处理。

正文到此结束