# fork-join **Repository Path**: fengxg/fork-join ## Basic Information - **Project Name**: fork-join - **Description**: java 并行框架fork/join 使用示例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2018-08-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- title: 2018-8-3 聊聊 fork-join框架 tags: java,并发,线程池 grammar_cjkRuby: true --- ## what? Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 ## why? 同样是线程池,为什么我们要用Fork/Join不用别的。 #### 工作窃取算法(work-stealing): 先执行完当前线程的任务,直接去从其他为执行完任务的线程中窃取任务执行; #### 图: ![任务窃取](https://www.github.com/fengxg/doc-img/raw/master/小书匠/任务窃取.png "任务窃取") 如图线程1先执行完自己的4个任务,线程2还有没执行的任务,线程1接着从线程2中获取未执行的任务。实现是基于 [双向队列 ](https://zhidao.baidu.com/question/576146424.html) ## How? ### RecursiveAction **执行没有返回结果的任务** - 新建 TestRecursiveAction 对任务进行分割的主线程类 com.fengxg.test.recursive.action.TestRecursiveAction - 新建 ActionWorkTask 分片后执行具体业务任务的类 com.fengxg.test.recursive.action.ActionWorkTask - 调用 ,测试类 com.fengxg.test.TestForkJoinMain 中调用 testRecursiveAction(datas); ### RecursiveTask **执行没有返回结果的任务** - 新建 TestRecursiveTask 对任务进行分割的主线程类 com.fengxg.test.recursive.task.TestRecursiveTask - 新建 TaskWorkTask 分片后执行具体业务任务的类 com.fengxg.test.recursive.task.TaskWorkTask - 调用 ,测试类 com.fengxg.test.TestForkJoinMain 中调用 testRecursiveTask(datas); ## So? 本示例只做fork-join应用展示,后续会有专门文章对其原理进行探讨。 对于批量操作独立任务的需求,fork/join 架构有着明显优势,尤其是在任务量大的时候。 但需要注意的是,多线程能发挥优势的环境是多核CPU(运行环境)。除此以外,需要使用者 针对需求自行调试出最佳分片(影响因素主要有CPU核数,任务量规模)。