• JUC-分支合并框架


    一、原理

    Fork:把一个复杂任务进行分拆,大事化小 

    Join:把分拆任务的结果进行合并

    ForkJoinPool

    分支合并池    类比=>   线程池

    ForkJoinTask

    ForkJoinTask    类比=>   FutureTask

    RecursiveTask

    递归任务:继承后可以实现递归(自己调自己)调用的任务

     class Fibonacci extends RecursiveTask<Integer> { 
       final int n; 
       Fibonacci(int n) { this.n = n; } 
       Integer compute() { 
         if (n <= 1) 
           return n; 
         Fibonacci f1 = new Fibonacci(n - 1); 
         f1.fork(); 
         Fibonacci f2 = new Fibonacci(n - 2); 
         return f2.compute() + f1.join(); 
       } 
     } 
    //代码

    import
      java.util.concurrent.ExecutionException;


    import  java.util.concurrent.ForkJoinPool;


    import  java.util.concurrent.ForkJoinTask;
    import  java.util.concurrent.RecursiveTask;
    

class  MyTask  extends  RecursiveTask<Integer>{
    
     private static final  Integer  ADJUST_VALUE  =  10 ;

         private int  begin ;
    
     private int  end ;
    
     private int  result ;
    

     public  MyTask( int  begin,  int  end) {
    
         this . begin  = begin;
    
         this . end  = end;
    
    }
    

     @Override

         protected  Integer compute() {
    
         if (( end  -  begin )<= ADJUST_VALUE ){

                for ( int  i = begin ;i <=  end ;i++){
    
                 result  =  result  + i;

               }
    
        } else {

                 int  middle = ( begin  +  end )/ 2 ;
    
            MyTask task01 =  new  MyTask( begin ,middle);

                MyTask task02 =  new  MyTask(middle+ 1 , end );
    
            task01.fork();

                task02.fork();
    
            result  =  task01.join() + task02.join();
    
        }



             return  result ;
    
    }
}




    /**
 * 分支合并例子
 * ForkJoinPool
 * ForkJoinTask
 * RecursiveTask
 */

    public class  ForkJoinDemo {


         public static void  main(String[] args)  throws  ExecutionException, InterruptedException {
            MyTask myTask =  new  MyTask( 0 , 100 );
    
        ForkJoinPool forkJoinPool =  new  ForkJoinPool();
    
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
    

        System. out .println(forkJoinTask.get());
    

        forkJoinPool.shutdown();
    
    }
}
  • 相关阅读:
    蓝桥杯省赛模拟:村庄建设、郊外植树。
    Andrew 算法(构造凸包)
    Codeforces Round #635 (Div. 2)(A, B, C, D)
    级边凸包构造法(extreme edge)
    极点的凸包构造算法(extreme point)
    Codeforces Round #633 (Div. 2)(A, B, C)
    凸包---graham scan算法 + 例题P2742
    Element-ui中ElScrollBar组件滚动条的使用
    HTTP:Web的基础
    HTTP报文
  • 原文地址:https://www.cnblogs.com/minmin123/p/11426334.html
Copyright © 2020-2023  润新知