- FutureTask: 存储任务的处理结果,更新任务的状态
- 既可以被当做Runnable来执行,也可以被当做Future来获取Callable的返回结果
- Future:
cancel isCancelled isDone get
- CompletionService 一边生成任务,一边获取任务的返回值,任务之间不会互相阻塞,可以实现先执行完的先取结果,不再依赖任务顺序了
- 内部通过阻塞队列+FutureTask,实现了任务先完成可优先获取到,即结果按照完成先后顺序排序
- 内部有一个先进先出的阻塞队列,用于保存已经执行完成的Future,通过调用它的take方法或poll方法可以获取到一个已经执行完成的Future,进而通过调用Future接口实现类的get方法获取最终的结果
- CompletionStage 执行某一个阶段,可向下执行后续阶段。异步执行,默认线程池是
ForkJoinPool.commonPool()
- CompletableFuture 实现了对任务的编排能力(业务逻辑处理存在串行[依赖]、并行、聚合的关系)
- 获取结果
- join 抛出的是 uncheck 异常(即未经检查的异常),不会强制开发者抛出
- get 抛出的是经过检查的异常,ExecutionException, InterruptedException 需要用户手动处理
- 结果处理:
whenComplete whenCompleteAsync exceptionally
- 当 CompletableFuture 的计算结果完成,或者抛出异常的时候,我们可以执行特定的 Action
- Action的类型是
BiConsumer<? super T,? super Throwable>
,它可以处理正常的计算结果,或者异常情况 - 方法不以Async结尾,意味着Action使用相同的线程执行,而Async可能会使用其它的线程去执行(如果使用相同的线程池,也可能会被同一个线程选中执行)
- 这几个方法都会返回CompletableFuture,当Action执行完毕后它的结果返回原始的CompletableFuture的计算结果或者返回异常
- 结果消费:结果消费系列函数只对结果执行Action,而不返回新的计算值
- thenAccept系列(
thenAccept thenAcceptAsync
):对单个结果进行消费 - thenAcceptBoth系列(
thenAcceptBoth thenAcceptBothAsync
):对两个结果进行消费- 当两个 CompletionStage 都正常完成计算的时候,就会执行提供的 action 消费两个异步的结果
- thenRun系列(
thenRun thenRunAsync
):不关心结果,只对结果执行Action- 也是对线程任务结果的一种消费函数,与 thenAccept 不同的是,thenRun 会在上一阶段 CompletableFuture 计算完成的时候执行一个Runnable,Runnable 并不使用该 CompletableFuture 计算的结果
- thenAccept系列(
- 依赖关系(结果转换)
- thenApply() 把前面异步任务的结果,交给后面的Function
- thenApply 转换的是泛型中的类型,返回的是同一个CompletableFuture
- thenCompose() 用来连接两个有依赖关系的任务,结果由第二个任务返回
- thenCompose 将内部的 CompletableFuture 调用展开来并使用上一个CompletableFutre 调用的结果在下一步的 CompletableFuture 调用中进行运算,是生成一个新的CompletableFuture
- thenApply() 把前面异步任务的结果,交给后面的Function
- and聚合关系(结果组合):合并线程任务的结果,并进一步处理
- thenCombine 任务合并,有返回值
- thenAccepetBoth 两个任务执行完成后,将结果交给thenAccepetBoth消耗,无返回值
- runAfterBoth 两个任务都执行完成后,执行下一步操作(Runnable)
- or聚合关系(任务交互:将两个线程任务获取结果的速度相比较,按一定的规则进行下一步处理)
- applyToEither 两个任务谁执行的快,就使用那一个结果,有返回值
- acceptEither 两个任务谁执行的快,就消费那一个结果,无返回值
- runAfterEither 两个线程任意一个任务执行完成,进行下一步操作 (Runnable)
- runAfterBoth 两个线程任务相比较,两个全部执行完成,才进行下一步操作,不关心运行结果
- 并行执行(多个 CompletableFuture 并行执行)
CompletableFuture#anyOf
anyOf 方法的参数是多个给定的 CompletableFuture,当其中的任何一个完成时,方法返回这个 CompletableFutureCompletableFuture#allOf
allOf方法用来实现多 CompletableFuture 的同时返回
- 异步操作
- runAsync 无返回值
- supplyAsync 有返回值
- 获取结果
上一篇
Java并发-happens-before
2024-06-13
下一篇
Java并发-ForkJoin
2024-06-13