java并发编程ForkJoinPool大量计算比较效率

package com.github.pig.auth;

import java.io.IOException;
import java.util.*;
import java.util.concurrent.*;


public class Test {

    int[] nums = new int[1000_0000];
    int CI = 1000;//计算多少次
    Random r = new Random();

    public Test() {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = r.nextInt(100);
        }
    }

    public static void main(String[] args) throws IOException {
        Arrays.stream(new int[3]).sum();//初始化sum内部排除初始化时间

        Test t = new Test();
        t.aa();
        t.bb();
        t.cc();
    }

    public void aa() {


        long start = System.currentTimeMillis();
        long n = 0;
        for(int i = 0; i< CI; i++) {
            n = Arrays.stream(nums).sum();
        }
        long end = System.currentTimeMillis();
        System.out.println("aa|"+ (end - start )+ "ms|" + n);
    }

    public void bb() {
        long start = System.currentTimeMillis();
        long n = 0;
        for(int j = 0; j< CI; j++) {
            n = 0;
            for (int i = 0; i < nums.length; i++) {
                n += nums[i];
            }
        }

        long end = System.currentTimeMillis();
        System.out.println("aa|"+ (end - start )+ "ms|" + n);
    }


    public void cc() throws IOException {
        ForkJoinPool pool = new ForkJoinPool();
        AddTask task = new AddTask(0,nums.length);
        long start = System.currentTimeMillis();
        for(int j = 0; j< CI; j++) {
            pool.execute(task);
        }

        long s = task.join();
        long end = System.currentTimeMillis();

        System.out.println("aa|"+ (end - start )+ "ms|" + s);
        System.in.read();
    }

    class AddTask extends RecursiveTask<Long>{

        int start;
        int end;

        public AddTask(int s,int e){
            this.start = s;
            this.end = e;
        }

        @Override
        protected Long compute() {

            if(end - start <= 50000){
                long sum = 0L;
                for(int i = start;i< end ;i++){
                    sum += nums[i];

                }
                return sum;
            }
            int m = start +(end-start)/2;

            AddTask sub1 = new AddTask(start,m);
            AddTask sub2 = new AddTask(m,end);
            sub1.fork();
            sub2.fork();

            return sub1.join()+sub2.join();

        }
    }

}



aa|4259ms|494971182
aa|4193ms|494971182

aa|26ms|494971182


第一种java8的stream跟for循环底层效果是一样的。

第三种并发计算 效果显而易见

猜你喜欢

转载自blog.csdn.net/hewei314599782/article/details/80150961