Fork/Join框架的学习和浅析

简介: Fork/Join框架的学习和浅析

Fork/Join框架的主要功能



Fork/Join框架主要完成了两件事情:


  1. 任务分割:首先把大的任务分割成足够小的子任务;
  2. 执行任务并合并结果:分割的子任务分别存放到双端队列中,然后几个启动线程风别从双端队列中获取任务执行,子任务执行完成的结果都存放在另一个队列里,启动一个线程从队列里取数据,然后合并这些数据;


Fork/Join框架的实现原理



ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成:


  1. ForkJoinTask数组负责将存放的程序提交给ForkJoinPool;
  2. ForkJoinWorkerThread负责执行这些任务 当调用ForkJoinTask的fork方法时,程序会把任务放在ForkJoinWorkerThread的putTask的workQueue中,异步的执行这个任务,然后立即返回结果


实例演示



  1. ForkJoinTask:我们使用Fork/Join框架首先要创建一个ForkJoin任务,需继承其子类:a. RecursiveAction:用于无返回值的任务 b. RecuriveTask:用于又返回值的任务
  2. ForkJoinPool:ForkJoinTask的执行环境 分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列尾部获取一个任务(工作窃取算法


//首先继承其子类,这个是有返回值的,所以继承RecursiveTask
public class CountTask extends RecursiveTask<Integer> {
 private static final int THREAD_HOLD = 2;
 private int satrt;
 private int end;
 public  CountTask(int start,int end){
  this.start = start;
  this.end = end;
 }
 @Override
 protected Integer compute(){
  int sum = 0;
  boolean flag = (end - start)<=THREAD_HOLD;
  if(flag){
   for(int i = start;i < end;i++){
    sum += i; 
   }
  } else {
   int middle = (start + end)/2;
   CountTask one = new CountTask(start,middle);
   CountTask two = new CountTask(middle+1,end);
   //执行子任务
   one.fork();
   two.fork();
   //获取子任务执行结果
   int oResult = one.join();
   int tResult = two.join();
   sum = oResult + tResult;
  }
  return sum;
 }
}
public class ExeWork {
 public static void main(String[] args){
  ForkJoinPool pool = new ForkJoinPool ();
  CountTask task = new CountTask(1,4);
  Future<Integer> result = pool.submit(task);
  try{
   //合并这些数据
   System.ot.println(result.get());
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}


Fork/Join框架的异常处理



ForkJoinTask在执行任务的时候可能会抛出异常,但主线程无法直接铺获异常,所以ForkJoinTask提供了isCompletedAbnormally()方法来检查任务是否已将抛出异常或已被取消了,并可以通过ForkJoinTask的getException方法获取异常.


目录
相关文章
|
17天前
|
JavaScript Java 大数据
分享Fork/Join经典案例
`shigen`是位专注于Java、Python、Vue和Shell的博主,分享技术成长和认知。上篇文章探讨了Java的Fork/Join框架,它类似线程池,通过拆分大任务并并行执行提升效率。以大序列求和为例展示了ForkJoinPool的使用,与普通线程池对比,Fork/Join效率提升约50%。适合递归任务、独立子任务和长执行时间的任务。注意任务粒度、避免共享状态和死锁。推荐观看相关视频深入理解。一起学习,每天进步!
14 0
分享Fork/Join经典案例
|
1月前
|
算法 Java API
探索Java并发编程:Fork/Join框架的深度解析
【2月更文挑战第26天】随着多核处理器的普及,并发编程在软件开发中的重要性日益凸显。Java语言提供了多种并发工具,其中Fork/Join框架是处理分而治之问题的一个强大工具。本文将深入探讨Fork/Join框架的设计原理、使用场景及与传统线程池的区别,并通过实例演示如何有效利用该框架提升程序性能。
|
1月前
|
分布式计算 并行计算 Java
探索Java并发编程:Fork/Join框架的应用与实践
【2月更文挑战第18天】在多核处理器时代,为了充分利用计算资源,并发编程成为开发者必备技能。Java提供了多种并发工具,其中Fork/Join框架是处理分而治之问题的有效手段。本文将深入探讨Fork/Join框架的原理、使用场景和实践技巧,帮助读者提升Java并发编程能力。
27 6
|
3月前
|
并行计算 算法 Java
Java并发 -- Fork/Join框架
Java并发 -- Fork/Join框架
32 0
|
7月前
|
并行计算 负载均衡 算法
什么是 Fork/Join 框架?Java 中如何使用 Fork/Join 框架?
什么是 Fork/Join 框架?Java 中如何使用 Fork/Join 框架?
|
10月前
|
分布式计算 算法 Java
【JUC基础】16. Fork Join
“分而治之”一直是一个非常有效的处理大量数据的方法。著名的MapReduce也是采取了分而治之的思想。。简单地说,就是如果你要处理 1000 个数据,但是你并不具备处理 1000个数据的能力,那么你可以只处理其中的 10 个,然后分阶段处理 100 次,将 100 次的结进行合成,就是最终想要的对原始 1000 个数据的处理结果。而这就是Fork Join的基本思想。
|
11月前
|
并行计算 算法 Java
并发编程-22J.U.C组件拓展之Fork/Join框架
并发编程-22J.U.C组件拓展之Fork/Join框架
69 0
|
并行计算 算法 Java
【JAVA并发编程专题】Fork/Join框架的理解和使用
【JAVA并发编程专题】Fork/Join框架的理解和使用
|
机器学习/深度学习 分布式计算 并行计算
面试官:说说你对Fork/Join的并行计算框架的了解?
面试官:说说你对Fork/Join的并行计算框架的了解?
面试官:说说你对Fork/Join的并行计算框架的了解?
|
缓存 并行计算 算法
浅析 Fork/Join 基本概念和实战
在 JDK 1.7 版本中提供了 Fork/Join 并行执行任务框架,它主要的作用是把大任务分割成若干个小任务,再对每个小任务得到的结果进行汇总,此种开发方法也叫做分治编程,分治编程可以极大的利用 CPU 资源,提高任务执行效率。
178 0
浅析 Fork/Join 基本概念和实战