一、简介
在hadoop的分布式计算框架MapReduce中,会经过两个过程Map过程和reduce过程。Map过程将任务并行计算,reduce汇总并行计算的结果。
MapReduce是在分布式环境中做分布式计算的,JDK1.7+以后再单击环境中也可以做类似的操作,它提供了一种ForkJoin框架。
ForkJoin框架中,fork()操作将任务异步并行执行,join()操作等待异步并行的结果,你可以将并行结果进行汇总,并通过Future等方式获取异步线程的执行结果。
JDK文档:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html
二、代码示例
以下代码示例对一个集合内的数据进行加法运算,我们将集合不断地拆分成两两加法,然后并行执行汇总结果。最后通过Future获取异步结果
import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; public class ForkJoinDemo extends RecursiveTask<Integer> { private List<Integer> nums; public ForkJoinDemo(List<Integer> nums) { this.nums = nums; } @Override protected Integer compute() { // 如果只有一个数据,直接返回 if (nums.size() == 1) { return nums.get(0); // 如果两个数据,相加 } else if (nums.size() == 2) { return nums.get(0) + nums.get(1); // 否则拆分任务 } else { // 拆分成两个任务异步执行,并等待异步结果 int result1 = new ForkJoinDemo(nums.subList(0, nums.size()/2)).fork().join(); int result2 = new ForkJoinDemo(nums.subList(nums.size()/2, nums.size())).fork().join(); // 汇总结果 int total = result1 + result2; // 返回汇总结果 return total; } } public static void main(String[] args) throws ExecutionException, InterruptedException { // 数据准备 Integer[] nums = {1,2,3,4,5,6,7,8,9}; List<Integer> list = Arrays.asList(nums); // 初始化fork任务 ForkJoinDemo forkJoinDemo = new ForkJoinDemo(list); // 初始化线程池 ForkJoinPool pool = new ForkJoinPool(); // 提交任务 Future<Integer> future = pool.submit(forkJoinDemo); // 阻塞获取返回值 System.out.println(future.get()); } }
最后输出:
45