2021-06-16 forkjion stream流式计算方法

本文介绍了如何使用Java的ForkJoinPool实现大数据范围内的求和计算,与普通循环和Stream流处理进行了对比,展示了在处理大规模数据时的性能优化。作者通过实例展示了ForkJoinPool的递归拆分和并行计算原理,以及Stream的并行求和方法。

在这里插入图片描述

//求和计算任务
public class Demo01 extends RecursiveTask<Long> {
    private long start; //1
    private long end;     //1990900000
    //临界值
    private long temp = 10000L;

    public Demo01(long start, long end) {
        this.start = start;
        this.end = end;
    }


//计算方法
    @Override
    protected Long compute() {
        if ((end - start) < temp) {
            long sum = 0L;
            for (long i = start; i < end; i++) {
                sum += i;
            }
            return sum;
        } else {
            //分支合并计算 forkjoin
            long middle = (start + end) / 2; //中间值
            Demo01 forkjoin1 = new Demo01(start, middle);
            forkjoin1.fork(); //拆分任务,把任务压入线程队列
            Demo01 forkjoin2 = new Demo01(middle+1, end);
              forkjoin2.fork();//拆分任务,把任务压入线程队列
            return forkjoin1.join() + forkjoin2.join();
        }


    }


}
//大数据量的时候使用
public class Test369 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
     test01();
    test02();
     test03();
    }
//普通的
    public static void test01(){
        long sum = 0L;
        long start = System.currentTimeMillis();
        for (long i = 1; i < 10_0000_0000L; i++) {
          sum+=i;
        }

        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+"时间: "+(end-start));
    }

    //使用forkjion的人员
    public static void test02() throws ExecutionException, InterruptedException {
        long start = System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Long> tast = new Demo01(0L, 10_0000_0000L);
        ForkJoinTask<Long> submit = forkJoinPool.submit(tast);//提交任务
        Long sum = submit.get();

        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+"时间: "+(end-start));
    }
 //使用Stream计算的人员
    public static void test03(){
        long start = System.currentTimeMillis();
        //Stream 并行流
                                                                                             //求和
        long sum = LongStream.rangeClosed(0L, 10_0000_0000).parallel().reduce(0, Long::sum);

        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+"时间: "+(end-start));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值