2.Fork/Join

1.简介

1)定义:Fork/Join是一个并行计算框架,它的任务模型是分治--》具体来讲,指的是把一个复杂的问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解

2)扩展:我们java提供的工具本质上是让我们把心思放在任务上,而不是放在线程的协作上,那常见的任务模型,除了分治,还有简单并行,聚合,批量并行!

3)分治任务模型

简版分治任务模型图

2.具体说明

1)类图--》其实ForkJoinPoll和ForkJoinTask类似于ThreadPoolExecutor和Runnable之间的关系!

类图

2)工作原理

ForkJoinPool与普通线程池不同,ThreadPoolExecutor内部只有一个任务队列,而ForkJoinPool内部有多个任务队列,当我们通过ForkJoinPool的invoke()或者submit()方法提交任务时,ForkJoinPool根据一定的路由规则把任务提交到一个任务队列中,如果任务在执行过程中会创建出子任务,那么子任务会提交到工作线程对应的任务队列中。

ForkJoinPool工作原理图

3)亮点

窃取机制:它为了保证每个队列均匀的被线程获取,所以提供了,指的是当前我的队列为空的时候,我就可以向别的队列去窃取任务,放到自己的队列!当然,这些队列都是双端队列,从不同的端切取,一定程度减少了冲突!

4)问题:代码俩次fork会出现性能下降的问题:---》因为当前的线程如果fork俩次,就相当于指挥俩个任务去执行任务,但是当前线程就会陷入等待中,从而导致性能下降    详情---》https://www.liaoxuefeng.com/article/001493522711597674607c7f4f346628a76145477e2ff82000

5)代码案例

Fork/Join代码案例

3.应用场景

1)统计单词数量

2)归并排序

3)阿里面试的数据类题目

你可能感兴趣的:(2.Fork/Join)