九 fork/join CompletableFuture
1: Fork/join
fork/join: fork是分叉的意思, join是合并的意思。
Fork/Join框架:是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
Fokr/Join的适合场景:所处理的元素必须是独立的,数据集要足够大;
并且在并行加速方面,每个元素的处理成本要足够高,这样才能补偿建立fork/join框架所消耗的成本。
这个文章中的例子(http://www.infoq.com/cn/articles/Functional-Style-Callbacks-Using-CompletableFuture)很好的说明了 Future, ExecutorCompletionService,
CompletableFuture处理一个图片下载的例子时候的对比。
2: Future:
Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值;
要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背;
Future
本身并不能提供回调方法. 任务提交到executor,通过Future.isDone和阻塞的Future.get()来看结果是否完成。
3: ExecutorCompletionService
把多个FutureTask提交到ExecutorCompletionService,task执行完的结果放到queue中,ExecutorCompletionService.get() 或者,poll()会从队列中依次取得
执行完的task, 再进行下一步处理。(这个方法比上面的方法好,上面只能是按照提交的顺序依次判断结果是否完成)
3: CompletableFuture
它能够将回调放到与任务不同的线程中执行(thenApplyAsync),也能将回调作为继续执行的同步函数(thenApply),在与任务相同的线程中执行。
它避免了传统回调最大的问题,那就是能够将控制流分离到不同的事件处理器中(thenApplyAsync()可以异步的在不同的线程中处理上一步结果)
4: CompletableFutre详解
待续... ...
5: java 8的 paralleStream 用 fork/join框架提供了并发执行能力。
待续... ...
6:
https://www.cnblogs.com/tian666/p/7840232.html