Tres métodos de ForkJoin para calcular la suma de 0 ~ 1 mil millones

ForkUnirseDemo

package com.xiaozhao.juc.forkjoin;


import java.util.concurrent.RecursiveTask;

/**
 * 如何使用forkjoin
 * 1.forkjoinPool 通过它来执行
 * 2.计算任务forkjoinPool.execute(ForkjoinTask task)
 * 3.计算类需要继承ForkjoinTask
 */
public class ForkJoinDemo extends RecursiveTask<Long> {
    private Long start;
    private Long end;
    private Long temp = 10000L;

    public ForkJoinDemo(Long start, Long end) {
        this.start = start;
        this.end = end;
    }
    public void test(){

    }

    @Override
    protected Long compute() {
        if((end-start) < temp){
            Long sum = 0L;
            for (Long i = start; i <= end; i++) {
                sum += i;
            }
//            System.out.println(sum);
            return sum;

        }else {
            //分支合并计算
            Long middle = (start+end) / 2;
            /**
             * 将任务拆分
             */
            ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
            task1.fork();//将任务压入线程队列

            ForkJoinDemo task2 = new ForkJoinDemo(middle+1,end);
            task2.fork();//将任务压入线程队列

            Long result = task1.join()+task2.join();

            return result;
        }
    }
}

Prueba

package com.xiaozhao.juc.forkjoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        test1();//执行计算1~10亿内求和,共花费时间:8770毫秒=====计算值:500000000500000000
//        test2();//执行计算1~10亿内求和,共花费时间:7872毫秒=====计算值:500000000500000000
        test3();//执行计算1~10亿内求和,共花费时间:538毫秒=====计算值:500000000500000000
    }

    public static void test1(){
        Long sum = 0L;
        long start = System.currentTimeMillis();

        for (Long i = 1L; i <= 10_0000_0000; i++) {
            sum += i;
        }

        long end = System.currentTimeMillis();
        System.out.println("执行计算1~10亿内求和,共花费时间:"+(end-start)+"毫秒"+"=====计算值:"+sum);
    }

    public static void test2() throws ExecutionException, InterruptedException {
        long start = System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Long> task = new ForkJoinDemo(0L, 10_0000_0000L);
        ForkJoinTask<Long> submit = forkJoinPool.submit(task);//提交任务
        Long sum = submit.get();
        long end = System.currentTimeMillis();
        System.out.println("执行计算1~10亿内求和,共花费时间:"+(end-start)+"毫秒"+"=====计算值:"+sum);    }

    public static void test3(){
        long start = System.currentTimeMillis();
        //stream并行流
        long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
        long end = System.currentTimeMillis();
        System.out.println("执行计算1~10亿内求和,共花费时间:"+(end-start)+"毫秒"+"=====计算值:"+sum);
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43562937/article/details/107049869
Recomendado
Clasificación