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


目录
相关文章
|
应用服务中间件 nginx
nginx日志模块 ngx_http_log_module
nginx日志模块 ngx_http_log_module
|
4天前
|
云安全 监控 安全
|
2天前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1164 7
|
11天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
734 42
|
15天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1176 41
|
15天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
942 78
大厂CIO独家分享:AI如何重塑开发者未来十年
|
3天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
|
2天前
|
人工智能 JSON 前端开发
为什么你的API文档总是被吐槽?用这份"契约指令"终结前后端战争
本文针对前后端协作中"文档过时、不准确"的痛点,提供了一套实战验证的AI指令。通过强制结构化输入和自检机制,让AI自动生成包含完整参数、JSON示例和多语言代码的标准API契约文档,彻底解决接口沟通难题。
173 112