美文网首页
2022-03-10

2022-03-10

作者: 前进的码农 | 来源:发表于2022-03-10 21:43 被阅读0次

    这就是Fork/Join任务的原理:判断一个任务是否足够小,如果是,直接计算,否则,就分拆成几个小任务分别计算。这个过程可以反复“裂变”成一系列小任务。

    我们来看如何使用Fork/Join对大数据进行并行求:

    public class SumTask extends RecursiveTask<Integer> {
        static final int THRESHOLD = 5;
        int start = 0;
        int end = 0;
    
        public SumTask(int start, int end) {
            this.start = start;
            this.end = end;
        }
    
        @Override
        protected Integer compute() {
            int sum = 0;
            if ((end-start)<=THRESHOLD){
                for (int i =start;i<=end;i++){
                    sum=sum+i;
                }
                return sum;
            }
            int mid = (end+start)/2;
            SumTask task1 = new SumTask(start,mid);
            SumTask task2 = new SumTask(mid+1,end);
            invokeAll(task1,task2);
            int r1 = task1.join();
            int r2 = task2.join();
            return r1+r2;
        }
    
        public static void main(String[] args) {
            ForkJoinTask<Integer> task= new SumTask(0,10);
            System.out.println(ForkJoinPool.commonPool().invoke(task));
            System.out.println(task);
      Long sum =  LongStream.rangeClosed(0L, 3L).parallel().reduce(0, Long::sum);
     reduce的第一个初始值如过按照并行流parallel计算的话,会根据计算机的核数每次都多加一个初始值
    
        }
    

    相关文章

      网友评论

          本文标题:2022-03-10

          本文链接:https://www.haomeiwen.com/subject/ixyqdrtx.html