Future接口可以构建异步应用,但依然有其局限性。它很难直接表述多个Future 结果之间的依赖性。实际开发中,我们经常需要达成以下目的:
- 将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。
- 等待 Future 集合中的所有任务都完成。
- 仅等待 Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。
- 通过编程方式完成一个Future任务的执行(即以手工设定异步操作结果的方式)。
- 应对 Future 的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future 计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)
产生一个CompletableFuture
CompletableFuture中4个异步执行任务静态方法:
其中supplyAsync用于有返回值的任务,runAsync则用于没有返回值的任务。Executor参数可以手动指定线程池,否则默认ForkJoinPool.commonPool()系统级公共线程池,
注意:这些线程都是Daemon线程,主线程结束Daemon线程不结束,只有JVM关闭时,生命周期终止。
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
return asyncSupplyStage(asyncPool, supplier);
}
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,Executor executor) {
return asyncSupplyStage(screenExecutor(executor), supplier);
}
public static CompletableFuture<Void> runAsync(Runnable runnable) {
return asyncRunStage(asyncPool, runnable);
}
public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) {
return asyncRunStage(screenExecutor(executor), runnable);
}
thenApplyAsync
CompletableFuture<T> ,转换成 CompletableFuture<U>
CompletableFuture<Map<Integer, List<Long>>> completableFuture1 = futures[0];
return completableFuture1.thenApplyAsync(completableFuture1 -> {
dosomething;
}, executor);
thenCombineAsync
将CompletableFuture<T> , CompletableFuture<U> 转换成 CompletableFuture<V>
CompletableFuture<Integer> completableFuture1 = futures[0];
CompletableFuture<String> completableFuture2 = futures[1];
return completableFuture1.thenCombine(completableFuture1, (future1, future2) -> {
Map<Integer, String> result = Maps.newHashMap();
return result;
});
allOf和anyOf
allOf是等待所有任务完成,构造后CompletableFuture完成
anyOf是只要有一个任务完成,构造后CompletableFuture就完成
参考
http://www.importnew.com/28319.html
https://blog.csdn.net/zero__007/article/details/50571703
https://blog.csdn.net/zero__007/article/details/50573562
https://blog.csdn.net/zero__007/article/details/50733664