CompletableFuture学习

使用场景

如果在一个项目中,用户查询一个商品信息,可能同时需要查询价格、图片、短标题等内容,且这些内容查询借助于不同接口。如果是串行执行,接口的响应速度会非常慢。所以这里采用并行方式,同时对接口进行调用查询。且可以基于任务执行的优先级顺序,进行多个任务的编排,优化时间。

Future

Java5引入Future类是也是异步执行任务,但是对于任务获取,需要通过Future.get()阻塞调用线程,或者使用轮询方式判断“Future.isDone”判断任务是否结束,再获取结果。
Future不支持异步任务编排组合

CompletableFuture

Java 8引入CompletableFuture 类可以解决Future的缺陷。CompletableFuture提供了函数式编程、异步任务编排组合(链式调用)等能力。
CompletableFuture 同时实现了 Future 和 CompletionStage 接口。

异步任务的编排

如果是采用Future,则需要采用线程池+Future的方式,当任务调用链条变长,则需要再写多次线程池+Future的方式,会造成代码非常拖沓。
CompletableFuture通过thenCombine等方式可以进行任务的编排。
一个CompletableFuture对象可以被一个环节接一个环节的处理,也可以对两个或者多个CompletableFuture进行组合处理或者等待结果完成。

Future在应对一些简单且相互独立的异步执行场景很便捷,但是在一些复杂的场景,比如同时需要多个有依赖关系的异步独立处理的时候,或者是一些类似流水线的异步处理场景时,就难以处理。

CompletableFuture方法

supplyAsync 静态方法,用于构建一个CompletableFuture对象,并异步执行传入的函数,允许执行函数有返回值T。
runAsync 静态方法,用于构建一个CompletableFuture对象,并异步执行传入函数,与supplyAsync的区别在于此方法传入的是Callable类型,仅仅执行,没有返回值。

CompletableFuture应用于流水线处理场景,在一个任务环节处理完成后,下一个任务环节接着上一个环节处理结果继续处理。

1、thenApply对CompletableFuture的执行后的具体结果进行追加处理,并将当前的CompletableFuture泛型对象更改为处理后新的对象类型,返回当前CompletableFuture对象
2、thenCompose与thenApply相似。区别在于:此方法的入参函数返回一个CompletableFuture类型对象
3、thenAccept与thenApply相似,区别在于thenAccept返回void类型在,没有具体结果输出,适合无需返回值的场景
4、thenRun,与thenAccept类似,区别在于thenAccept可以将CompletableFuture执行的结果作为入参传入并使用,但是thenRun没有任何入参,只能执行一个Runnable函数,并且返回void类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值