本文最后更新于:2024年4月22日 下午
了解JUC的概念,学习并找我CompletableFuture的使用及其应用场景
什么是JUC
J.U.C并发包,即java.util.concurrent
包,是JDK的核心工具包,是JDK1.5之后,由 Doug Lea实现并引入。
整个java.util.concurrent
包,按照功能可以大致划分如下:
- juc-locks 锁框架
- juc-atomic 原子类框架
- juc-sync 同步器框架
- juc-collections 集合框架
- juc-executors 执行器框架
CompletableFuture
Callable接口与Runnable接口
Callable
接口类似于Runnable
,因为它们都是为其实例可能由另一个线程执行的类设计的。 然而,Runnable
不返回结果,也不能抛出被检查的异常。具体区别如下
- Callable功能更强大些。
- 相比run()方法,可以有返回值。
- 方法可以抛出异常。
- 支持泛型的返回值。
- 需要借助FutureTask类,比如获取返回结果。
Future 接口
Future接口用于对异步任务的执行结果进行取消、查询是 否完成、获取结果等
FutureTask
FutureTask是Future的实现,可用于包装Callable
或Runnable
对象,提交给Thread执行,这样就可以使用FutureTask执行一些Feture的特性方法
总结FutureTask
优点:可以包装异步任务,拿到执行结果
缺点:get方法,会阻塞,就失去了并发的特性,变成同步方法
使用总结:实际使用是尽量不要阻塞,采用get(long timeout, TimeUnit unit),带超时时间,并且放在最后,但这种本质上只是算一种减轻,并不是算替代。
更好的方式是采用轮询方式,CompletableFuture
CompletableFuture
CompletableFuture是对Future的改进
Demo1
CompletionStage介绍:是Java8新增得一个接口,用于异步执行中的阶段处理,代表异步计算中的一个阶段或步骤
基本写法,是继承了Future 的特性,所以此时调用Future.get 同样会阻塞主线程
Demo2
应对Future的完成回调功能
当多个一步计算互相独立,同时第二个任务又依赖第一个的结果时
这种异步的特性就是CompletableFuture对CompletionStage的继承实现。
CompletableFuture常用API
获得结果和触发计算
get 获取结果,捕获异常
get(long timeout, TimeUnit unit) 超时过时不候
join 不用抛异常
T getNow(T valueIfAbsent) 没计算完返回默认值
boolean complete(T value) 打断成功,返回默认值,打断失败,返回真实值
对计算结果进行处理
- thenApply 线程串行化,有异常终止
- handle 有异常会继续执行
对计算结果进行消费
- thenAccept 有一个输入参数,没有返回,Consumer接口
对计算速度进行选用
对计算结果进行合并