zoukankan      html  css  js  c++  java
  • 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();
    
    }
}
  • 相关阅读:
    转:Unity3D的四种坐标系
    在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢
    Unity3d 引擎原理详细介绍、Unity3D引擎架构设计
    vs2010打开vs2012的sln文件
    Unity3d不支持vistual studio2012?用vs2012打开unity c#脚本进行编码的方法。
    C#学习笔记15:字符串、文件、目录的操作方法
    C#学习笔记14:面向对象继承的特点和里氏转换
    C#学习笔记13:静态方法、方法重载和ref、out参数
    C#学习笔记12:枚举、结构、数组基础学习
    C#学习笔记11:C#中的顺序结构、分支结构、循环结构
  • 原文地址:https://www.cnblogs.com/minmin123/p/11426334.html
Copyright © 2011-2022 走看看