ForkJoinPool实现数组求和

一、ForkJoinPool

* Fork/Join是一种思想,目的在充分利用多核资源,用于执行并行任务;
* ForkJoinPool是ExecutorService的实现类,是上述思想的实现
* 做法是:将一个大的任务分割成若干小任务,最终汇总成每个小任务结果,从而得到大任务结果

二、创建ForkJoinPool

构造器:
ForkJoinPool(int parallelism) 根据指定任务的并行级别。创建一个ForkJoinPool
ForkJoinPool() 根据计算机的核心数目,创建一个ForkJoinPool

三、使用ForkJoinPool

常用方法:public <T> ForkJoinTask<T> submit(ForkJoinTask<T> task){...}
ForkJoinTask
    1、代表一个可以并行执行的任务,是Future的实现类、
    2、RecursiveAction 、 RecursiveTask是他的子类
    3、RecursiveAction代表没有返回值的任务,RecursiveTask有返回值的任务。

四、代码展示

求前100项和?

 public static void main(String[] args) throws ExecutionException, InterruptedException {
        int[] nums = new int [100];
        for (int i = 1; i <= 100; i++){
            nums[i-1] = i;
        }
        ForkJoinPool pool = new ForkJoinPool();
        Future<Integer> future = pool.submit(new FJTask(nums,0,nums.length-1));
        System.out.println(future.get());
    }
    //并行计算出结果
    private static class FJTask extends RecursiveTask<Integer>{

        private static final int THRESHOLD = 10;//定义一个阈值,代表将数据拆分,传入数据如果大于10,就拆分,小于十进行计算
        private int[] nums;
        private int start ,end;//定义处理数组的起始点和终止点

        public FJTask(int[] nums,int start,int end){//使用构造器
            this.nums = nums;
            this.start = start;
            this.end = end;
        }

        @Override
        protected Integer compute() {
            System.out.printf("%-25s\t%2d,%2d\n",Thread.currentThread().getName(),start,end);
            //计算逻辑
            Integer sum = 0;
            //数组片段小于阈值
            if(end - start < THRESHOLD){
                for (int i = start; i <= end; i++){
                    sum += nums[i];
                }
            }else {
                //拆分数据
                int middle = (start + end) / 2;
                //类似递归处理
                FJTask left = new FJTask(nums,start,middle);
                FJTask right = new FJTask(nums,middle+1,end);
                left.fork();
                right.fork();
                sum = left.join() + right.join();//sum等于左边合并结果+右边合并结果
            }
            return sum;
        }
    }

运行结果:为了展示并行的思想,输出计算逻辑的。如果不需要,可以删除下面代码即可

            System.out.printf("%-25s\t%2d,%2d\n",Thread.currentThread().getName(),start,end);

ForkJoinPool-1-worker-1       0,99
ForkJoinPool-1-worker-3      50,99
ForkJoinPool-1-worker-2       0,49
ForkJoinPool-1-worker-4      50,74
ForkJoinPool-1-worker-2       0,24
ForkJoinPool-1-worker-2       0,12
ForkJoinPool-1-worker-3      63,74
ForkJoinPool-1-worker-6      75,99
ForkJoinPool-1-worker-5      25,49
ForkJoinPool-1-worker-4      50,62
ForkJoinPool-1-worker-5      25,37
ForkJoinPool-1-worker-6      75,87
ForkJoinPool-1-worker-3      63,68
ForkJoinPool-1-worker-2       0, 6
ForkJoinPool-1-worker-0       7,12
ForkJoinPool-1-worker-7      13,24
ForkJoinPool-1-worker-0      57,62
ForkJoinPool-1-worker-3      69,74
ForkJoinPool-1-worker-6      75,81
ForkJoinPool-1-worker-5      25,31
ForkJoinPool-1-worker-4      50,56
ForkJoinPool-1-worker-5      32,37
ForkJoinPool-1-worker-6      82,87
ForkJoinPool-1-worker-0      38,49
ForkJoinPool-1-worker-7      13,18
ForkJoinPool-1-worker-0      38,43
ForkJoinPool-1-worker-4      88,99
ForkJoinPool-1-worker-0      44,49
ForkJoinPool-1-worker-7      19,24
ForkJoinPool-1-worker-0      94,99
ForkJoinPool-1-worker-4      88,93
5050

Process finished with exit code 0
 

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值