总文档 :文章目录
Github : github.com/black-ant
Fork / Join 是一个工具框架 , 其核心思想在于将一个大运算切成多个小份 , 最大效率的利用资源 , 其主要涉及到三个类 : ForkJoinPool / ForkJoinTask / RecursiveTask
一 . Fork / Join 入门
什么是 Fork / Join
该框架是一个工具 , 通过分而治之的方式尝试将所有可用的处理器内核使用起来帮助加速并行处理
- fork : 递归地将任务分解为较小的独立子任务 , 直到它们足够简单以便异步执行
- join : 将所有子任务的结果递归的连接成单个结果
原理简述 :
- Fork / Join 的执行是先把一个大任务分解(fork)成许多个独立的小任务,然后起多线程并行去处理这些小任务。处理完得到结果后再进行合并(join)就得到我们的最终结果。
- Fork / Join 使用的算法为 work-stealing(工作窃取)
- 该算法会把分解的小任务放在多个双端队列中,而线程在队列的头和尾部都可获取任务。
- 当有线程把当前负责队列的任务处理完之后,它还可以从那些还没有处理完的队列的尾部窃取任务来处理
Fork / Join 线程池 :
- ForkJoinPool : 用于管理 ForkJoinWorkerThread 类型的工作线程
- 实现了 ExecutorService接口 的多线程处理器
- 把一个大的任务划分为若干个小的任务并发执行,充分利用可用的资源,进而提高应用的执行效率
参考 @ blog.csdn.net/tyrroo/arti…
二 . 说一说 RecursiveTask
RecursiveTask 是一种 ForkJoinTask 的递归实现 , 例如可以用于计算斐波那契数列 :
1 | java复制代码 class Fibonacci extends RecursiveTask<Integer> { |
RecursiveTask 继承了 ForkJoinTask 接口 ,其内部有几个主要的方法:
1 | java复制代码 |
常见使用方式:
1 | java复制代码@ |
三 . Fork Join 用法
1 | java复制代码// 前提 : 需要继承 RecursiveTask<Integer> 类 , 且实现 compute 方法 |
三 . ForkJoinTask 用法
ForkJoinTask:代表fork/join里面任务类型,我们一般用它的两个子类RecursiveTask、RecursiveAction。这两个区别在于RecursiveTask任务是有返回值,RecursiveAction没有返回值。任务的处理逻辑包括任务的切分都集中在compute()方法里面。
四 . ForkJoinPool 线程池
作用 : ForkJoinPool为来自非ForkJoinTask客户端的提交提供入口点,以及管理和监视操作,最原始的任务都要交给它才能处理 .
主要功能包括 :
- 负责控制整个fork/join有多少个workerThread,workerThread的创建,激活都是由它来掌控。
- 负责workQueue队列的创建和分配,每当创建一个workerThread,它负责分配相应的workQueue。
- 把接到的活都交给workerThread去处理,它可以说是整个frok/join的容器。
备注 :
ForkJoinPool不同于其他类型的ExecutorService,主要是因为它使用了窃取工作:池中的所有线程都试图找到并执行提交到池中的任务和/或其他活动任务创建的任务(如果没有工作,最终会阻塞等待工作)。
ForkJoinPool 基础用法
1 | java复制代码ForkJoinPool forkJoinPool = new ForkJoinPool(); |
当大多数任务衍生出其他子任务时,以及当许多小任务从外部客户端提交到池时,这使得高效处理成为可能。
特别是当在构造函数中将asyncMode设置为true时,ForkJoinPool s也可能适合用于从未连接的事件风格任务。
ForkJoin 前知识点 : ForkJoinWorkerThread
ForkJoinWorkerThread 为 fork/join里面真正干活的”工人”,本质是一个线程 ,其里面有一个ForkJoinPool.WorkQueue的队列存放着它要干的活,接活之前它要向ForkJoinPool注册(registerWorker),拿到相应的workQueue。然后就从workQueue里面拿任务出来处理。
ForkJoinWorkerThread 依附于ForkJoinPool而存活,如果ForkJoinPool的销毁了,它也会跟着结束。
1 | java复制代码 |
ForkJoinPool 代码深入
1 | java复制代码 |
总结
总体来说还是不够深入 , 包括其中的性能 , invoke 实际上都还没有测试 , 实际上 ForkJoinPool 源码深入都不到一成 , 但是看源码看的有点头疼了 ,先这样了 , 后续会尽力把他完善清楚
参考与感谢
1 | java复制代码[芋道源码](http://www.iocoder.cn/JUC/sike/aqs-3/) |
了解更多
本文转载自: 掘金