1)可组合 + 异步
2)2个接口:
CompletionStage // 实现编排接口
Future
3)构建依赖树的过程
每一个步骤都是一个CompletableFuture
最终构建到最后,还是一个CompletableFuture
4)runAsync 和 supplyAsync
5)完成:
cf.complete(xxx);
6)使用CompletableFuture完成任务编排:
其它的接口
cf.complete(xxx)
cf.completeExceptionally(throwable)
return cf;
7)一元依赖:
thenApply
thenAccept
thenCompose
8)二元依赖:
thenCombine
9)多元依赖:
allOf 和 anyOf
10)底层实现:
result
stack:观察者模式
11)死锁问题原因:
父任务再等待子任务执行,但是:有很多个父任务,把线程池占满了,但是又在等待子任务执行。 子任务又没线程可执行,就死锁了。
解决办法:父任务 和 子任务 要用线程池进行隔离。
xdb的话,call则是:再当前线程同步执行。
----------
cancel:
并不是真的把任务取消了,而是仅仅是一个标记,任务是否执行不一定,很可能执行了。标记完后,去拿结果,就会触发CancellationException。
如果任务已经完成了,那取消也没用了。
---------
Future
FutureTask
CompletionService
CompletableFuture
------------20230805 对CompletableFuture的总结----------
package org.example.cf;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws Exception {
// 要返回值的
CompletableFuture<Integer> retCf = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 2;
});
// 回调方式运行(链式的调用)
retCf.whenComplete((ret, e)->{
System.out.println(ret);
});
// 不要返回值的
CompletableFuture<Void> noRetCf = CompletableFuture.runAsync(() -> {
});
// 2个都运行完毕
CompletableFuture.allOf(retCf, noRetCf);
// 2个有协作关系,1个运行后的结果作为另一个的输入
CompletableFuture<Integer> objectCompletableFuture = retCf.thenApplyAsync((intRet) -> {
return 222;
});
}
}
可见,CompletableFuture其实可以完全代替FutureTask、Callable这些东西。
而且提供超时。
提供多个异步任务的协作。