Java--JUC--ForkJoinPool合并分支框架

  1. FrokJoinPool,ForkJoinTask,RecursiveTesk(合并分支框架)
  2. package com.model.threadpool;
    
    import java.util.concurrent.*;
    
    /**
     * @Description:测试类
     * @Author: 张紫韩
     * @Crete 2021/6/9 9:16
     */
    public class ForkJoinDemo {
    
        /**
         *分支合并框架:
         * ForkJoinPool
         * ForkJoinTask
         * RecursiveTask
         *
         * 例子:实现0都100的相加,使用分支和合并的方式实现,
         * 讲0 到100分成0到50和51到100,在讲0到50分。。。
         * 最后在和并到一起,多个线程递归实现相加,比一个线程的方式快
         * 
         * fork():异步执行任务
         * Join():返回完成状态
         * 实现了future接口,我们可以直接get返回值
         */
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
    
            ForkJoinPool forkJoinPool=new ForkJoinPool();
            MyTask myTask=new MyTask(0, 100);
            ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
            System.out.println(forkJoinTask.get());
            forkJoinPool.shutdown();
    
    
        }
    
    }
    
    class MyTask extends RecursiveTask<Integer> {
        private Integer start;
        private Integer end;
        private Integer res=0;
        private static final Integer  ADJUST_VALUE=10;
    
        public MyTask(Integer start, Integer end) {
            this.start = start;
            this.end = end;
        }
        @Override
        protected Integer compute() {
            if (end-start<=ADJUST_VALUE){
                for (int i=start;i<=end;i++){
                    res+=i;
                }
            }else {
                Integer mobile=(start+end)/2;
                MyTask myTask=new MyTask(start,mobile);
                MyTask myTask1=new MyTask(mobile+1, end);
                myTask.fork();
                myTask1.fork();
                res=myTask.join()+ myTask1.join();
            }
            return res;
        }
    
    }

     

posted @ 2021-06-09 13:33  张紫韩  阅读(53)  评论(0编辑  收藏  举报