一 基础知识
P1
- Future优势
相比于所有任务都直接在主线程处理,有很多优势,但有以下不足- 在没有阻塞情况下,无法对Future结果执行进一步的操作。
Future不会告知你它什么时候完成,如果想得到结果必须通过get(),该方法会阻塞到结果可用为止。它不具备将回调函数附加到Future后并在Future的结果可用时自动调用回调的能力。 - 无法解决任务相互依赖的问题。
- 不能将多个Future合并在一起,假设你有多种不同的Future,你想在它们全部并行完成后然后再运行某个函数,Future很难独立完成这一个需要。
- 没有异常处理。
Future提供的方法中没有专门的API应对异常处理,还需要开发者手动异常处理。
- 在没有阻塞情况下,无法对Future结果执行进一步的操作。
- CompletableFuture优势
- 实现了Future和CompletionStage接口
- 为快速创建、链接依赖和组合多个Future提供了大量的便利方法;
- 提供了适用于各种开发场景的回调函数,全面的异常处理支持;
- 无缝连接和亲和lambda表达式和Stream-API
P6 异步任务概述
一. 创建异步任务
- runAsync
当需要异步运行某些耗时的后台任务,并且不想从任务中返回任何内容,则可使用CompletableFuture.runAsync()方法,它接收一个Runnable接口的实现类对象,返回CompleteableFuture对象- 异步任务的底层还是新建一个线程的方式实现的
P15 异步任务的编排
- thenCompse 用来连接两个依赖关系的异步任务,结果由第二个任务返回;
- 方法
- thenCompose、thenComposeAsync
- thenApply、thenApplyAsync
P16
- 编排2个非依赖关系的异步任务thenCombine()
- thenCombineAsync
- thenCombine
- 用于合并两个没有关系的任务。
- 合并多个异步任务allOf、anyOf
- 可编排任意数量的CompletableFuture。
- allOf: 适合合并多个异步任务
- anyOf: 当给定的多个异步任务中有任意一个Future完成时需要执行一些操作,可使用anyOf方法;
- exceptionally()
- handle()
- 常用来恢复回调链中的一次特定异常,回调链恢复后可进一步向下传递;
- 作用:对上一步异步任务进行现场恢复;
- 异步任务交互—applyToEither
- 功能:把2个异步任务做比较,异步任务先到结果的,就对先到的结果进行下一步的操作。 先到先用
- acceptEither
- 功能:把料你刚刚异步任务作比较,异步任务先到的结果 的,就对先到的结果进行下一步操作(消费使用);
- runAfterEither
- 功能:若不关系最先到达的结果,指向在有一个异步任务完成时得到完成的同志,可使用runAfterrEither()
- get 与join的区别
- get抛出检查异常,需要程序必须处理,而join抛出运行时异常,程序可不处理。所以join更适合用在流式编程中。
P26 并行流
- 并行流的局限性
- 只能使用默认的线程池,不能灵活配置线程池;
- 使用CompletableFuture进一步增强并行性