Fork/Join

  JAVA7中出现的Fork/Join,类似于分布式文件系统hadoop的mapreduce思想,就是将任务分割,再分割,直到分割到满足条件

  为了便于理解:编程逻辑可以借用 递归的思想,层层递归,直到碰到最终调件,然后层层返回;而在Fork/Join中就是,类似把每个递归的方法,单独的放到一个线程中;

  充分利用现代多核处理器,对任务进行并行处理

  如:

  

/**
* 继承RecursiveTask 则每个子任务带返回值
* 继承RecursiveAction 则每个子任务不带返回值
*/
public class FockJoin1 extends RecursiveTask<Integer>{ public static void main(String[] args) throws ExecutionException, InterruptedException {
long l = System.currentTimeMillis();
ForkJoinPool pool = new ForkJoinPool(); //类似线程池,也实现了AbstractExecutorService
FockJoin1 task = new FockJoin1(1,1000000000); //新建任务
Future<Integer> result = pool.submit(task); //将任务提交
System.out.println("result is" + result.get()); //获取结果
System.err.println(System.currentTimeMillis() - l);
} private final Integer index = 5000; //分割任务的基数
private final Integer left;
private final Integer right; public FockJoin1(Integer left, Integer right) {
this.left = left;
this.right = right;
} @Override
protected Integer compute() {
int sum = 0;
if(right - left < index) { //如果任务 小于基数,则直接执行;类似递归的出口
for (int i = left; i <= right; i++) {
sum += i;
}
}else { //任务 大于基数,则分割,类似与二分法,也可以更多
int middle = (right + left) >> 1;
FockJoin1 myf1 = new FockJoin1(left, middle); //二分法左边
FockJoin1 myf2= new FockJoin1(middle+1, right); //二分法右边
myf1.fork(); //继续执行,类似递归
myf2.fork(); //继续执行,类似递归
Integer integer1 = myf1.join(); //等待
Integer integer2 = myf2.join();
sum = integer1 + integer2; //结果合并
}
return sum;
}
}

java并发编程(10)Fork/Join的更多相关文章

  1. 【java并发系列】Fork/Join任务(转)

    原文链接 当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成 ...

  2. JAVA并发工具类---------------(Fork/Join)

    Fork/Join 分而治之 将一个大任务分成数个小任务执行,然后将这些小人物执行后的结果进行join汇总: (假设:你要计算1到1000的总和,你可以把它分成1-100,101-200,...... ...

  3. 多线程高并发编程(8) -- Fork/Join源码分析

    一.概念 Fork/Join就是将一个大任务分解(fork)成许多个独立的小任务,然后多线程并行去处理这些小任务,每个小任务处理完得到结果再进行合并(join)得到最终的结果. 流程:任务继承Recu ...

  4. Java 并发编程 -- Fork/Join 框架

    概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...

  5. Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  6. Java并发编程原理与实战二十一:线程通信wait&notify&join

    wait和notify wait和notify可以实现线程之间的通信,当一个线程执行不满足条件时可以调用wait方法将线程置为等待状态,当另一个线程执行到等待线程可以执行的条件时,调用notify可以 ...

  7. 【转】Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线 ...

  8. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  9. 10、Java并发编程:并发容器之ConcurrentHashMap

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  10. Java并发编程系列-(9) JDK 8/9/10中的并发

    9.1 CompletableFuture CompletableFuture是JDK 8中引入的工具类,实现了Future接口,对以往的FutureTask的功能进行了增强. 手动设置完成状态 Co ...

随机推荐

  1. 10-08常用的TIME和DATE函数以及各个函数对应的头文件

    系统时间和日期函数:     #include <time.h>     char *asctime(const struct tm *tm);//将tm中存放的信息转换为标准格式    ...

  2. ES6——Class的继承

    class 的继承和使用. 子类继承父类,使用extends关键字. 为父类知道那个静态方法,使用 static方法名字super: 在构造函数中,可以当一个函数来使用,相当于调用父类的构造函数. 在 ...

  3. NPOI 设置excel 边框

    https://blog.csdn.net/xxs77ch/article/details/50232343

  4. Dapper.Contrib.Extensions问题

    Dapper.Contrib.Extensions问题 Dapper.Extension.1.0.0.1\lib\net45\Dapper.Extension.dll Dapper.Contrib.1 ...

  5. Problem I: GJJ的日常之玩游戏(GDC)

    Contest - 河南省多校连萌(四) Problem I: GJJ的日常之玩游戏 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 107  Solve ...

  6. BZOJ3729: Gty的游戏(伪ETT)

    题面 传送门 前置芝士 巴什博奕 \(Nim\)游戏的改版,我们现在每次最多只能取走\(k\)个石子,那么\(SG\)函数很容易写出来 \[SG(x)=mex_{i=1}^{\min(x,k)}SG( ...

  7. php性能优化三(PHP语言本身)

    0.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册 ...

  8. 如何实现三个div都自适应(滴滴面试题)

    <div class="table"> <div class="accordant"> <div class="box& ...

  9. Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm Lorg/gradle/api/artifacts/ModuleIdentifier;

    今天碰到一个问题, 正常的下载gradle到本地,然后到spring官网上通过他们提供的start.spring.io创建一个demo项目, 然后在idea中打开,并配置下载的gradle到idea中 ...

  10. table组件选中数据回显

    table组件多选状态下,把已选择的数据回显,需要在多选列上加上一个属性 :reserve-selection="true" 实例如下: <el-table :data=&q ...