先引用<<Java 7 Concurrency Cookbook>>书中一段关于Fork Join的描述:
This framework is designed to solve problems that can be broken into smaller tasks using the divide and conquer technique. Inside a task, you check the size of the problem you wantto resolve and, if it's bigger than an established size, you divide it in smaller tasks that are executed using the framework. If the size of the problem is smaller than the established size,you solve the problem directly in the task and then, optionally, it returns a result. The following diagram summarizes this concept:
描述很清楚,易懂。Fork 就是把任务划分, Join就是等所有的子任务都完成后执行的合并操作。
前提就是 所谓的任务要可以拆分,比如说有求10万个数字的和,可以改成2个5万数字求和的求和,再可以分成4个2.5万数字求和的求和的求和。
就拿求和做个例子(1-100求和):
package com.javaeye.demo; import java.util.List; import java.util.concurrent.RecursiveTask; public class Task extends RecursiveTask<Integer>{ private static final long serialVersionUID = 1L; private List<Integer> numberList; private int start; private int end; private int THRESHOLD = 10; public Task(List<Integer> numberList) { this.numberList = numberList; start = 0; end = this.numberList.size() - 1; } public Task(List<Integer> numberList, int start, int end) { this.numberList = numberList; this.start = start; this.end = end; } @Override protected Integer compute() { if (end - start <= THRESHOLD) { return sum(); } else { int pivot = (end + start )/2; Task task1 = new Task(numberList, start, pivot); Task task2 = new Task(numberList, pivot+1, end); task1.fork(); task2.fork(); return task1.join() + task2.join(); } } private Integer sum() { Integer sum = 0; for (int i = start;i <= end; i++) { sum += this.numberList.get(i); } return sum; } }
package com.javaeye.demo; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; public class Main { public static void main(String[] args) throws Exception{ ForkJoinPool pool = new ForkJoinPool(); Task task = new Task(getData(100)); Future<Integer> result = pool.submit(task); System.out.println(result.get()); } private static List<Integer> getData(int len) { List<Integer> list = new ArrayList<Integer>(); for (int i=1; i <= len; i++) { list.add(i); } return list; } }
输出结果: 5050.
只为简单记录。
相关推荐
Fork/Join框架是Java7中新增的一项特性,也是Java7平台的其中一项主要改进。下面我们就来简单探讨下Java的Fork/Join框架
JoinAndForkUtility 可轻松使用 java 7 中的 join 和 fork 功能的实用程序类。 易于使用并提高耗时 for 循环的性能。 更多的是尝试将 fork/join/compute 方法等与业务问题分离。用法如果您必须为大量对象循环耗时的...
Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等... 未完成模块:阿里Java手册、java8,注解,fork/join,加解密等。
## 使用ForkJoin Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内...
未完成模块:阿里Java手册,java8,注解,fork / join,加解密等。 我微信:bysocket01,加入纯技术交流群,成长技术 给教程的开源代码仓库点个Star吧 帮忙分享该系列文章链接给更多的朋友 如果您对Java基础核心类...
3. 提供使用场景,例子参考说明.4. 熟悉JDK7新特性和库对Android开发(基于Java语言)更加得心应手。 5. 熟悉JDK7新特性能方便进行Java底层开发,比如Spring MVC. 6. IDE目前基于轻便的VSCode开发说明, 也可以自行通过...
84 6.2.1 start(开始活动) 85 6.2.2 state(状态活动) 86 6.2.3 decision(判断活动) 89 6.2.4 fork – join(分支/聚合活动) 97 6.2.5 end(结束活动) 102 6.2.6 task(人工任务活动) 107 6.2.7 sub-process...
2.2 、Hello World 例子 6 三、学习JPDL 11 3.1 、简介 11 3.2 、流程版本(Version) 11 3.3 、流程定义 12 3.3.1 process-definition(流程定义) 12 3.3.2 node(自动节点) 13 3.3.3 start-state(开始状态) 13 3.3.4...
高并发编程第三阶段34讲 ForkJoin框架之RecursiveAction_.mp4 高并发编程第三阶段35讲 Phaser工具的实战案例使用第一部分_.mp4 高并发编程第三阶段36讲 Phaser工具的实战案例使用第二部分_.mp4 高并发编程第...
高并发编程第三阶段34讲 ForkJoin框架之RecursiveAction_.mp4 高并发编程第三阶段35讲 Phaser工具的实战案例使用第一部分_.mp4 高并发编程第三阶段36讲 Phaser工具的实战案例使用第二部分_.mp4 高并发编程第...