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方法获取异常.


目录
相关文章
|
6月前
|
JavaScript Java 大数据
分享Fork/Join经典案例
`shigen`是位专注于Java、Python、Vue和Shell的博主,分享技术成长和认知。上篇文章探讨了Java的Fork/Join框架,它类似线程池,通过拆分大任务并并行执行提升效率。以大序列求和为例展示了ForkJoinPool的使用,与普通线程池对比,Fork/Join效率提升约50%。适合递归任务、独立子任务和长执行时间的任务。注意任务粒度、避免共享状态和死锁。推荐观看相关视频深入理解。一起学习,每天进步!
43 0
分享Fork/Join经典案例
|
6月前
|
并行计算 算法 Java
探索Java并发编程:Fork/Join框架的深度解析
【5月更文挑战第29天】在多核处理器普及的时代,有效利用并发编程以提升程序性能已经成为开发者必须面对的挑战。Java语言提供的Fork/Join框架是一个强大的工具,它旨在利用多线程执行分而治之的任务。本文将通过深入分析Fork/Join框架的工作原理、关键特性以及与传统线程池技术的差异,帮助开发者更好地掌握这一高效处理并发任务的技术手段。
|
6月前
|
并行计算 安全 算法
探索Java并发编程:Fork/Join框架的应用与优化
在多核处理器普及的今天,并发编程已经成为提高程序性能的重要手段。Java提供了多种并发工具,其中Fork/Join框架是处理分治任务的强大工具。本文将深入探讨Fork/Join框架的核心原理、使用场景以及性能优化技巧,帮助开发者更好地利用这一框架解决实际问题。通过实例分析,我们将看到如何有效地使用Fork/Join框架来加速计算密集型任务,并提供一系列最佳实践,以确保高效和线程安全的并发执行。
|
6月前
|
分布式计算 并行计算 Java
探索Java并发编程:Fork/Join框架的应用与实践
【2月更文挑战第18天】在多核处理器时代,为了充分利用计算资源,并发编程成为开发者必备技能。Java提供了多种并发工具,其中Fork/Join框架是处理分而治之问题的有效手段。本文将深入探讨Fork/Join框架的原理、使用场景和实践技巧,帮助读者提升Java并发编程能力。
79 6
|
6月前
|
并行计算 算法 Java
Java并发 -- Fork/Join框架
Java并发 -- Fork/Join框架
61 0
|
并行计算 负载均衡 算法
什么是 Fork/Join 框架?Java 中如何使用 Fork/Join 框架?
什么是 Fork/Join 框架?Java 中如何使用 Fork/Join 框架?
|
并行计算 算法 Java
并发编程-22J.U.C组件拓展之Fork/Join框架
并发编程-22J.U.C组件拓展之Fork/Join框架
106 0
|
并行计算 算法 Java
【JAVA并发编程专题】Fork/Join框架的理解和使用
【JAVA并发编程专题】Fork/Join框架的理解和使用
|
机器学习/深度学习 分布式计算 并行计算
面试官:说说你对Fork/Join的并行计算框架的了解?
面试官:说说你对Fork/Join的并行计算框架的了解?
面试官:说说你对Fork/Join的并行计算框架的了解?
|
缓存 并行计算 算法
浅析 Fork/Join 基本概念和实战
在 JDK 1.7 版本中提供了 Fork/Join 并行执行任务框架,它主要的作用是把大任务分割成若干个小任务,再对每个小任务得到的结果进行汇总,此种开发方法也叫做分治编程,分治编程可以极大的利用 CPU 资源,提高任务执行效率。
218 0
浅析 Fork/Join 基本概念和实战