简介
为了提高接口的响应速度,接口内的业务逻辑可实现并行化改造。JUC提供的并发工具
CompletableFuture提供的方法:
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
Executor executor) {
return asyncSupplyStage(screenExecutor(executor), supplier);
}
很容易使用自定义的线程池去异步执行,而且CompletableFuture为我们提高了强大的任务编排和异常处理方法。
在开发中,开发者经常使用CompletableFuture结合stream来实现异步并行化执行。
CompletableFuture结合stream来实现并行化,小心没有效果
CompletableFuture结合stream来实现并行化,使用姿势不对,会导致无法达到并行异步化的效果,例如:
核心操作:list -> steam -> map(CompletableFuture) -> map (CompletableFuture::join)-> toList。
运行结果:
在运行过程中,结果都是一个个的顺序执行,而且模拟耗时总时间与依次顺序执行耗时时间相差无几。
CompletableFuture结合stream来实现并行化,使用正确的姿势:一定要拆分成两个流处理,即一定要先拆分出CompletableFuture流,并对此流做终止操作(terminal operation )。
正确姿势:
因为流的中间操作(intermediate operation )是惰性求值,只有遇到终止操作(terminal operation )才会触发对流进行处理求值。
运行结果:
我们一般对流中的元素转换为CompletableFuture,使用终止操作toList方法,使得异步先开始执行,才能达到异步执行的目的。
小结
CompletableFuture结合stream来实现并行化,使用正确的姿势:一定要拆分成两个流处理,即一定要先拆分出CompletableFuture流,并对此流做终止操作(terminal operation ),使得异步先开始执行。