十八、fork/join框架

一、简介

在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

猜你喜欢

转载自www.cnblogs.com/lay2017/p/10167600.html