Fork/Joinについて


fork/joinのjava 7が新たに追加した機能は、同時フレームワークと理解できる.我々はfork/joinにより1つの分解可能な大きなタスクを複数のサブタスクに分解して同期して実行し,実行が完了した後,各サブタスクの結果を統合し,最終的な結果を得ることができる.
fork/joinを使用するには、まずfork/joinタスクを作成します.RecursiveActionまたはRecursiveTaskを継承することで実現できます(ForkJoinTaskは親です).
  • RecursiveActionは結果
  • を返さない
  • RecursiveTaskは結果
  • を返します.
    一般的な方法
  • compute(); 計算方法(分割サブタスク)
  • fork();//サブタスク実行
  • join();//サブタスクが終了すると、対応する結果
  • が返される.
    ForkJoinPoolはこのほか、javaはForkJoinPoolのツールクラスを提供しています.これにより、空きスレッドが他のスレッドから分解されたサブタスクを自発的に分担することができ、すべてのスレッドができるだけフルな作業状態になり、実行効率が向上します.
    一般的な方法
  • execute();//非同期実行コマンド
  • invoke()とinvokeAll();//非同期でコマンドを実行し、対応する結果
  • を返す.
  • submit();//コマンドを非同期で実行し、Futureオブジェクト
  • に戻る
    使用方法は以下の通りです.
    class Demo extends java.util.concurrent.RecursiveTask<Integer>{
        int start;
        int end;
    
        public Demo(int start,int end){
            this.start=start;
            this.end=end;
        }
    
        @Override
        protected Integer compute() {
            int sum=0;
            int s=start;
            int e=end;
            for(;s<=end;s++){
                sum+=s;
            }
            return sum;
        }
    }
    
    @Test
    public void test2(){
        //1 1 ,    0.37
        Demo demo1=new Demo(1,50000000);
        Demo demo2=new Demo(50000001,100000000);
        demo1.fork();
        demo2.fork();
        System.out.println(demo1.join()+demo2.join());
    }
    
    @Test
    public void test3(){
        ForkJoinPool fjp=new ForkJoinPool();
        Demo demo1=new Demo(1,50000000);
        Demo demo2=new Demo(50000001,100000000);
        System.out.println(fjp.invoke(demo1)+fjp.invoke(demo2));
    }