一、整理的原因
整理的原因是在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