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


目录
相关文章
|
Arthas Java 测试技术
Arthas本身并没有提供直接让进程结束时自动生成火焰图的配置
【2月更文挑战第31天】Arthas本身并没有提供直接让进程结束时自动生成火焰图的配置
303 2
|
Dubbo Java 应用服务中间件
项目中引进这玩意,排查日志又快又准
随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候,因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。
|
11月前
|
移动开发 JavaScript 前端开发
HTML5 Web Workers详解
HTML5 Web Workers 允许在后台线程中运行 JavaScript,实现复杂计算而不影响用户界面,提升应用性能。其主要特性包括并行处理、异步通信、独立作用域及多数据类型支持。通过创建和使用 Worker 文件,如 `worker.js`,可执行后台任务,并与主线程通过消息传递机制通信。适用于数据处理、图像处理、复杂计算及网络请求并行等场景。需要注意的是,Web Workers 在浏览器兼容性、安全性限制、调试及资源消耗方面需特别关注。合理利用 Web Workers 可显著增强 Web 应用的流畅度和响应速度。
|
NoSQL 安全 Java
分布式锁实现原理与最佳实践
在单体的应用开发场景中涉及并发同步时,大家往往采用Synchronized(同步)或同一个JVM内Lock机制来解决多线程间的同步问题。而在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。接下来本文将为大家分享分布式锁的最佳实践。
|
前端开发 开发者
|
存储 设计模式 Java
Java中的if-else语句:深入解析与应用实践
Java中的if-else语句:深入解析与应用实践
339 1
|
SpringCloudAlibaba Java Maven
【问题篇】Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/
【问题篇】Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/
413 2
|
SQL JSON 监控
实时计算 Flink版产品使用合集之直接将 JSON 字符串解析为数组的内置函数如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Java Nacos 开发工具
微服务轮子项目(16) -Alibaba Sentinel限流熔断(使用示例)
微服务轮子项目(16) -Alibaba Sentinel限流熔断(使用示例)
274 0
|
Java
java手机号码脱敏
手机号脱敏处理主要是通过使用String.replaceAll()方法
302 0