CompletableFuture学习整理

简介: 整理的原因是在Sentinel源码中,我们可以看到很多关于CompletableFuture的thenCompose的源码。同时在业务系统里面也看到别人写过类似的代码。因此整理了一下关于CompletableFuture使用的相关类型和特性,在处理复杂耗时业务时可以选择组合使用。

一、整理的原因

整理的原因是在Sentinel源码中,我们可以看到很多关于CompletableFuture的thenCompose的源码。同时在业务系统里面也看到别人写过类似的代码。其中Sentinel一处代码如下:

privatevoidapplyAllClientConfigChange(Stringapp, ClusterAppAssignMapassignMap,

                                           Set<String>failedSet) {

       Set<String>clientSet=assignMap.getClientSet();

       if (clientSet==null||clientSet.isEmpty()) {

           return;

       }

       finalStringserverIp=assignMap.getIp();

       finalintserverPort=assignMap.getPort();

       clientSet.stream()

           .map(MachineUtils::parseCommandIpAndPort)

           .filter(Optional::isPresent)

           .map(Optional::get)

           .map(ipPort-> {

               CompletableFuture<Void>f=sentinelApiClient

                   .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT)

                   .thenCompose(v->sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2,

                       newClusterClientConfig().setRequestTimeout(20)

                           .setServerHost(serverIp)

                           .setServerPort(serverPort)

                   ));

               returnTuple2.of(ipPort.r1+'@'+ipPort.r2, f);

           })

           .forEach(t->handleFutureSync(t, failedSet));

   }

因此整理了一下关于CompletableFuture使用的相关类型和特性,在处理复杂耗时业务时可以选择组合使用。

下面相关方法的demo参考我的github上的demo:

https://github.com/123monkey/practice.git

二、相关的使用方法

1.supplyAsync

有返回值

2.runAsync

不支持返回值

3.completableFuture获取结果

join:抛出的是uncheck异常(即未经检查的异常),不会强制开发者抛出

get:抛出的是受查异常,ExecutionException, InterruptedException 需要用户手动处理(抛出或者 try catch)

4.计算结果完成后的处理方法

whenComplete
  • 当completableFuture的计算结果完成,或者抛异常时,可以执行特定的action
whenCompleteAsync
  • 把whenCompleteAsync的任务action继续提交给线程池来执行,即执行CompletableFuture的任务和执行whenCompleteAsync的任务的线程可能是两个不同的线程
thenApply
  • 当线程B依赖于线程A的执行结果时,可以使用thenApply方法来把这两个线程串行化
thenApplyAsync
  • 线程异步
handle
  • handle方法和thenApply方法处理方式基本一样,不同的是handle里的方法是在supplyAsync/runAsync执行后一定会执行的,即使supplyAsync/runAsync里抛了异常也会执行handle里的方法,而thenApply只可以执行正常的任务,任务出现异常则不执行thenApply方法
handleAsync
  • 处理线程异步
thenAccept
  • thenAccept方法同样也是对前面的supplyAsync/runAsync生成的结果进行消费,但是不同点在于thenAccept方法只是纯消费,不返回值
thenCompose
  • thenCompose()用来连接两个CompletableFuture,返回值是新的CompletableFuture;
  • thenApply()转换的是泛型中的类型,是同一个CompletableFuture。
thenCombine
  • thenCombine会把两个CompletableFuture的任务都执行完成后,把两个任务的结果一块交给thenCombine来处理,并生成新的CompletableFuture任务。

5.allOf

allOf方法的入参是若干个CompletableFuture任务,返回类型是CompletableFuture,allOf方法是等所有的CompletableFuture都执行完后再执行计算,一般后面会跟链式的thenApply方法或者thenAccept方法对所有的异步任务进行汇总处理

6.anyOf

anyOf方法入参是若干个CompletableFuture任务,返回类型是CompletableFuture,anyOf方法只要有一个CompletableFuture任务完后就执行计算,一般后面会跟链式的thenApply方法或者thenAccept方法对结果进行处理,anyOf方法没allOf方法使用广泛。

三、整理的xmind

image-20230216222859450.png


目录
相关文章
|
Java 测试技术
java多线程使用案例
java多线程使用案例
82 0
|
1月前
|
监控 Java
JavaGuide知识点整理——线程池的最佳实践
总之,合理使用和配置线程池是提高 Java 程序性能和稳定性的重要手段。遵循最佳实践,可以更好地发挥线程池的作用,提升系统的运行效率。同时,要不断地进行监控和优化,以适应不同的业务需求和环境变化。
105 63
|
7月前
|
前端开发 Java API
Java并发基础:CompletableFuture全面解析
CompletableFuture类使得并发任务的处理变得简单而高效,通过简洁的API,开发者能轻松创建、组合和链式调用异步操作,无需关心底层线程管理,这不仅提升了程序的响应速度,还优化了资源利用率,让复杂的并发逻辑变得易于掌控。
198 1
Java并发基础:CompletableFuture全面解析
|
7月前
|
安全 算法 Java
Java 并发编程 面试题及答案整理,最新面试题
Java 并发编程 面试题及答案整理,最新面试题
238 0
|
安全 Java 容器
Java多线程案例
Java多线程案例
|
Java
CompletableFuture总结和实践
CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程,与主线程分隔开,并在上面运行一个非阻塞的任务,然后通知主线程进展,成功或者失败。
375 0
|
消息中间件 存储 Java
一网打尽异步神器CompletableFuture
最近一直畅游在RocketMQ的源码中,发现在RocketMQ中很多地方都使用到了CompletableFuture,所以今天就跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture,并且最后会结合RocketMQ源码分析一下CompletableFuture的使用。
Java 8 的异步利器:CompletableFuture源码解析(建议精读)
实现了俩接口,本身是个class。这个是Future的实现类,使用 completionStage 接口去支持完成时触发的函数和操作。
|
消息中间件 JavaScript 小程序
一网打尽:异步神器 CompletableFuture 万字详解!
一网打尽:异步神器 CompletableFuture 万字详解!
|
消息中间件 Dubbo Kafka
CompletableFuture学习
前面我们已经知道CompletionService是可以解决Future带来的阻塞问题的,同时我们除了前面我们看到的take方法之外,还可以使用poll方法,这样可以使你的程序免受阻塞之苦。因为poll方法也是无阻塞性的。同时在kafka的源码中,我们如果使用消费者的话,可以看到会使用一个基于future的poll方法。同时我们可以在dubbo的新版本2.7中,可以看到其异步编程采用的就是我们要介绍的CompletableFuture。因此,我们有必要了解CompletableFuture,同时其也是真正意义上的异步编程的实现。
158 0
CompletableFuture学习