ForkJoin

  • Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架

Fork/Join中两个重要的类

  • ForkJoinTask:使用该框架,需要创建一个ForkJoin任务,它提供在任务中执行fork和join操作的机制。
  • 一般情况下,我们并不需要直接继承ForkJoinTask类,只需要继承它的子类,它的子类有两个:
  • RecursiveAction:用于没有返回结果的任务
  • RecursiveTask:用于有返回结果的任务
  • ForkJoinPool:任务ForkJoinTask需要通过ForkJoinPool来提交任务
package com.example.core.juc;import java.util.concurrent.*;public class UseForkJoin extends RecursiveTask<Integer> {//执行计算并要求返回结果的需要继承RecursiveTask<Integer>//RecursiveTask<Integer>其中Integer为计算的类型private static final int THRESHOLD = 2;//阈值,也就是拆分的原则private int start;private int end;public UseForkJoin(int start,int end){this.start = start;this.end = end;}@Overrideprotected Integer compute(){int sum = 0; //1+2+3+......+100boolean canCompute = (end - start) <= THRESHOLD;if(canCompute){for(int i = start;i<=end;i++){sum += i;}}else{//如果,任务数大于阈值的情况,就进行拆分 fork操作 然后去join//1 + 100/2 = 50int middle = (start + end)/2;UseForkJoin leftTask = new UseForkJoin(start,middle);UseForkJoin rightTask = new UseForkJoin(middle+1,end);//执行左右两边的任务leftTask.fork();rightTask.fork();//等待任务执行完成之后,进行获取结果int leftResult = leftTask.join();int rightResult = rightTask.join();sum = leftResult + rightResult;}return sum;}public static void main(String[] args) throws InterruptedException, ExecutionException {ForkJoinPool pool = new ForkJoinPool();UseForkJoin ufj = new UseForkJoin(1,100);Future<Integer> result = pool.submit(ufj);System.out.println("最终的结果是:"+result.get());}
}
/*
output:
最终的结果是:5050*/

Java JUC工具类--ForkJoin相关推荐

  1. Java JUC工具类--Future

    Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程) 在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式 ...

  2. Java JUC工具类--Semaphore

    Semaphore 在Semaphore信号量非常适合高并发访问限制,新系统在上线之前,要对系统的访问量进行评估,评估是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评估 当然评估标准 ...

  3. Java JUC工具类--Master-Worker

    Master-Worker Master-Worker模式是常用的并行计算模式.它的核心思想是系统由两类进程协作工作:Master进程和Worker进程 Master负责接收和分配任务,Worker负 ...

  4. Java JUC工具类--Exchanger

    Exchanger Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据 两个线程通过exchange方法交换数据,如果一个线程先执行exchange ...

  5. Java JUC工具类--CyclicBarrier

    CyclicBarrier:栅栏的概念,多线程的进行阻塞,等待某一个临界值条件满足后,同时执行 类比:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待 p ...

  6. Java JUC工具类--CountDownLatch

    CountDownLatch:用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行 package com.example.core.juc;import java.u ...

  7. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  8. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

  9. java日期工具类DateUtil

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. DateUtil类 [java] view plain copy package com.util; ...

最新文章

  1. 趣图:老手调试多线程,666
  2. android 多屏幕适配 : 第一部分
  3. UA PHYS515A 电磁理论IV 时变电磁场理论2 Helmholtz方程与含时的Green函数
  4. 深度学习tensorflow变量op
  5. [JavaWeb-JavaScript]JavaScript概念与功能
  6. jenkins触发构建后一直重复构建
  7. shell中if条件字符串、数字比对,` `和[ ]区别
  8. swing JTable学习(七)—TableModelListener
  9. 【技术直通车】使用FME Extension for ArcGIS读取ArcPad AXF文件
  10. EditPlus中文版64bit百度网盘下载
  11. Windows权限维持
  12. RS/CQI/SINR/RSRP/RSSI都是什么意思?
  13. java小组口号,小组口号大全
  14. 科研画图都用什么软件
  15. camunda工作流开发实战------04 请假流程实例
  16. 计组作业【题目记录】
  17. imx6u开发板导入实际应用(一)熟悉开发板,建立调试环境
  18. PMOS管用作电源开关注意事项
  19. 大型门户网站的十四大技术
  20. 牛客华为题库前40题

热门文章

  1. linux和python的关系_Python、Linux与我的缘分
  2. xps13 linux 硬盘分区,在xps13上安装ubuntu16.04教程
  3. LSGO软件技术团队2015~2016学年第十三周(1123~1129)总结
  4. 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较
  5. 【转】什么是SIEM?
  6. 【编译原理】学习LUA
  7. frameset ajax,js控制frameSet示例
  8. 【Gym - 101612C】【2017-2018NEERC】Consonant Fencity(状压枚举,预处理)
  9. 【HDU - 1847】Good Luck in CET-4 Everybody! (巴什博奕,PN图或sg函数)
  10. linux非权限安装bioperl,bioperl的安装