BoneCP源码——BoneCP中使用的第三方包 jsr166y fork-join框架
?
什么是Fork-Join模式?
Fork-Join是把一个任务递归的分解成多个子任务,直到每个子问题都足够小,然后把这些问题放入队列中等待处理(fork步骤),接下来等待所有子问题的结果(join步骤),最后把多个结果合并到一起。

?
?更多的Fork-Join学习资料:
JDK 7 中的 Fork/Join 模式
Java 理论与实践: 应用 fork-join 框架
Java 理论与实践: 应用 fork-join 框架,第 2 部分
?
?例子:在一个文本里有N多个数据,使用多线程最快求和
这个是之前用JUC包实现的一个问题,使用Fork-Join模式很容易解决上JUC时的问题:
/** * Huisou.com Inc. * Copyright (c) 2011-2012 All Rights Reserved. */package thread;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.RecursiveAction;/** * @description * * @author chenzehe * @email hljuczh@163.com * @create 2013-3-19 上午10:12:31 */public class CalculateWithForkJoin {public static void main(String[] args) {int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 };NumbersStructure numbersStructure = new NumbersStructure(numbers, 0, numbers.length);int threshold = 5;int nThreads = 5;CalculateForkJoinTask calculateForkJoinTask = new CalculateForkJoinTask(numbersStructure, threshold);ForkJoinPool forkJoinPool = new ForkJoinPool(nThreads);forkJoinPool.invoke(calculateForkJoinTask);int sum = calculateForkJoinTask.sum;System.out.println(sum);}}class CalculateForkJoinTask extends RecursiveAction {private static final longserialVersionUID= -3958126944793236011L;private final intthreshold;private final NumbersStructurenumbersStructure;public intsum;public CalculateForkJoinTask(NumbersStructure numbersStructure, int threshold) {this.numbersStructure = numbersStructure;this.threshold = threshold;}@Overrideprotected void compute() {if (numbersStructure.size < threshold) {sum = numbersStructure.calculateSum();}else {int midpoint = numbersStructure.size / 2;CalculateForkJoinTask left = new CalculateForkJoinTask(numbersStructure.subproblem(0, midpoint), threshold);CalculateForkJoinTask right = new CalculateForkJoinTask(numbersStructure.subproblem(midpoint + 1, numbersStructure.size), threshold);invokeAll(left, right);sum = left.sum + right.sum;}}}class NumbersStructure {private final int[]numbers;private final intstart;private final intend;public final intsize;public NumbersStructure(int[] numbers, int start, int end) {this.numbers = numbers;this.start = start;this.end = end;this.size = end - start;}/** * 求和 */public int calculateSum() {int sum = 0;for (int i = start; i <= end && i < numbers.length; i++) {sum += numbers[i];}return sum;}/** * 问题分解 */public NumbersStructure subproblem(int subStart, int subEnd) {return new NumbersStructure(numbers, start + subStart, start + subEnd);}}?
?
?
?