一、原理

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();

    }
}

JUC-分支合并框架的更多相关文章

  1. ForkJoinPool 分支/合并框架

    ForkJoinPool 分支/合并框架 一.Fork/Join框架简介 Fork/Join 框架就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小 ...

  2. 11.ForkJoinPool 分支/合并框架 (工作窃取)

    /*ForkJoinPool 分支/合并框架 (工作窃取)*/ Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork) 成若干个小任务(拆到给出的临界值为止),再将一个个的小 ...

  3. ForkJoinPool分支合并框架-工作窃取

    Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成 若干个小任务(拆到不可再拆时), 再将一个个的小任务运算的结果进行 join 汇总 For ...

  4. java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取

    Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总. Fork/Join 框架与线程池的 ...

  5. ForkJoinPool分支/合并框架工程使用的工作窃取

    ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ...

  6. 【JUC】JUC线程池框架综述

    一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...

  7. 分支合并git checkout adview git merge adview3

    分支合并 git checkout adview git merge adview3

  8. (转)SVN分支/合并原理及最佳实践

    先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...

  9. ECLIPSE下SVN的创建分支/合并/切换使用

    最近接项目要求,要在svn主干上创建分支,用分支来进行程序的bug修改,而主干上进行新功能的开发.分支上的bug修改完,发布后,可以合并到主干上.项目程序可以在主干和分支之间进行切换,来实现主干和分支 ...

  10. Git 分支合并

    理解核心 Git最初只有一个分支,所有后续分支都是直接或间接的从这个分支切出来的. 在任意两个分支上,向前追溯提交记录,都能找到一个最近的提交同时属于这两个分支,这个提交就是两个分支的分叉节点 分支合 ...

随机推荐

  1. 解决Spring Security自定义filter重复执行问题

    今天做项目的时候,发现每次拦截器日志都会打两遍,很纳闷,怀疑是Filter被执行了两遍.结果debug之后发现还真是!记录一下这个神奇的BUG! 问题描述 项目中使用的是Spring-security ...

  2. 在Oracle中使用sqlload做数据迁移

    前提:检查sqlload是否可用,输入sqlldr,提示有版本即可   1.创建测试表(已有则跳过)create table testTable(user varchar2(255),name var ...

  3. 大数据才是未来,Oracle、SQL Server成昨日黄花?

    1. 引子**** 有人在某个专注SQL的公众号留言如下: 这个留言触碰到一个非常敏感的问题:搞关系型数据库还有前途吗?现在都2020年了,区块链正火热,AI人才已经"过剩",大数 ...

  4. 剑指offer-面试题43-1~n整数中1出现的次数-归纳法

    /* 题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没 ...

  5. opencv —— imread、namedWindow & imshow、cvtColor、imwrite 加载、显示、修改、保存图像

    加载图像:imread 函数 Mat imread(const string& filename, int flags = 1): filename:需要载入的图像的路径名. flags:加载 ...

  6. kali-linux下载地址

    1 https://www.kali.org/downloads/2 http://cdimage.kali.org/ 下载地址.

  7. ArcGIS Server 地图服务,查询出错 Error performing query operation

    Error: Error performing query operation Error Message Querying a layer from a Map Service that retur ...

  8. DataReader类型化数据读取与装箱性能研究

    前言 在各种ORM框架或者SQL映射框架(例如MyBatis,SOD框架之SQL-MAP功能)中,都有将查询的结果映射为内存对象的需求,包括映射到实体类.简单类型(例如Java的POJO,.NET的P ...

  9. Jekyll 摘要

    在 Windows 上安装 Requirements Permalink Ruby version 2.4.0 or above, including all development headers ...

  10. P3759 [TJOI2017]不勤劳的图书管理员 [树套树]

    树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...