ForkjoinTask 测试

package com.huang.test.concurrent;

import java.util.concurrent.*;

/**
 * ForkJoin:分治处理问题。
 */
public class ForkJoinTest {

    public static void main(String[] args) {
        ForkJoinTest fjt = new ForkJoinTest();
        fjt.test();
    }

    class MyTask extends RecursiveTask<Long>
    {
        private static final long serialVersionUID = -2358776679174639606L;

        long[] array;
        private int start;
        private int end;

        MyTask(long[] array, int start, int end)
        {
            this.array = array;
            this.start = start;
            this.end = end;
        }

        @Override
        protected Long compute() {
            if(end - start <= 10)
            {
                long sum = 0;
                for(int i = start;i <= end;i++)
                {
                    sum += array[i];
                }
                return sum;
            }else
            {
                int middle = (end + start)/2;
                MyTask taskLeft = new MyTask(array, start, middle);
                MyTask taskRight = new MyTask(array, middle + 1, end);

                taskLeft.fork();
                taskRight.fork();
                long leftSum = taskLeft.join();
                long rightSum = taskRight.join();

                return leftSum + rightSum;
            }
        }
    }

    private void test() {
        ForkJoinPool pool = new ForkJoinPool(16);
        long[] arr = new long[100000000];
        for(int i = 0;i < arr.length;i++)
        {
            arr[i] = i + 654632563456754l;
        }
        MyTask task = new MyTask(arr, 0, arr.length - 1);
        long start = System.nanoTime();
        ForkJoinTask<Long> fur = pool.submit(task);
        try {
            pool.shutdown();
            long res = fur.get();
            long end = System.nanoTime();
            System.out.println("res:" + res + ", use time:" + (end - start));
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }


        testSum(arr);

    }

    private void testSum(long[] arr)
    {
        long start = System.nanoTime();
        long sum = 0;
        for(int i = 0;i < arr.length;i++)
        {
            sum += arr[i];
        }
        long end = System.nanoTime();
        System.out.println("test sum:" + sum + ", use time:" + (end - start));
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值