【框架】说一说 Fork/Join?

SueWakeup

                                                      个人主页:SueWakeup

                                                      系列专栏:学习Java框架

                                                      个性签名:人生乏味啊,我欲令之光怪陆离 

本文封面由 凯楠📷 友情赞助

 

目录

前言

什么是 Fork?

什么是 Join?

Fork/Join 的核心组件

Fork/Join 的工作流程

1. 创建 ForkJoinPool

2. 提交任务

3. 执行任务

4. 任务拆分与执行

5. 结果合并

Fork/Join 计算斐波那契数列

 注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转  


前言

        Fork/Join 框架是 Java 7中引入的一个并行(同时)计算框架,主要用于处理递归式任务。


什么是 Fork?

        Fork 是指将一个大任务拆分成多个小任务并行(同时)执行


什么是 Join?

        Join 是指等待这些小任务执行完成,并将它们的结果合并


Fork/Join 的核心组件

  • ForkJoinPool:整个框架的线程池,负责管理工作线程以及任务的调度和执行
ForkJoinPool 示意图
  • ForkJoinTask:可分解的任务,一般情况下通过基础 RecursiveTask(有返回结果)或 RecursiveAtion(无返回结果)来实现具体的任务
ForkJoinTask 示意图
  • ForkJoinWorkerThread :工作线程,负责执行 ForkJoinTask 中的任务
ForkJoinWorkerThread 示意图

Fork/Join 的工作流程

1. 创建 ForkJoinPool

  • 创建一个 ForkJoinPool 对象,一般情况下使用默认的构造函数创建一个适合当前系统环境的 ForkJoinPool

2. 提交任务

  • 将需要执行的任务提交给 ForkJoinPool,通常通过 invoke 方法或者 submit 方法来提交任务

3. 执行任务

  • ForkJoinPool 会将任务分配给其内部的 ForkJoinWorkerThread 来执行。每个工作线程都会从任务队列中获取任务并执行

4. 任务拆分与执行

  • 在任务的执行过程中,如果存在需要拆分的子任务,工作线程会调用任务的 fork 方法将子任务提交给 ForkJoinPool
  • ForkJoinPool 会根据工作窃取算法,将子任务分配给其他空闲的工作线程执行,从而实现任务的并行执行

5. 结果合并

  • 当子任务执行完成后,工作线程会调用任务的 join 方法等待子任务的执行结果
  • 如果存在必要,结果合并的过程也可以递归进行,直到得到最终的结果


Fork/Join 计算斐波那契数列

// 继承 RecursiveTask 来实现可返回结果的任务
public class FibonacciTask extends RecursiveTask<Integer> {private int n;public FibonacciTask(int n) {this.n = n;}@Overrideprotected Integer compute() {if (n <= 1) {return n;} else {FibonacciTask task1 = new FibonacciTask(n - 1);task1.fork(); // 拆分任务FibonacciTask task2 = new FibonacciTask(n - 2);return task2.compute() + task1.join(); // 合并结果}}public static void main(String[] args) {int n = 10;ForkJoinPool forkJoinPool = new ForkJoinPool();FibonacciTask fibonacciTask = new FibonacciTask(n);int result = forkJoinPool.invoke(fibonacciTask); // 同步执行任务并获取结果System.out.println("位于" + n + "处的斐波那契数为:" + result);}}

解读:

  • 定义 FibonacciTask 类,继承自 RecursiveTask,用于计算斐波那契数列第 n 个数
  • 在 compute() 方法中,判断如果 n 小于等于 1,则返回 n
  • 否则,将任务拆分为两个部分,分表计算第 n-1 和 第 n-2 个斐波那契数
  • 通过 join() 方法等待第 n-1 的计算结果完成后将结果合并

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285457.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流畅的 Python 第二版(GPT 重译)(二)

第三章&#xff1a;字典和集合 Python 基本上是用大量语法糖包装的字典。 Lalo Martins&#xff0c;早期数字游牧民和 Pythonista 我们在所有的 Python 程序中都使用字典。即使不是直接在我们的代码中&#xff0c;也是间接的&#xff0c;因为dict类型是 Python 实现的基本部分。…

酷开系统让用户和电视双向传递,酷开科技实现商业变现

电视在我们的日常生活中扮演着重要的角色。虽然&#xff0c;作为客厅C位的扛把子——电视的娱乐作用深入人心&#xff0c;但是&#xff0c;它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异&#xff0c;而我们的生活环境又受到我们所处的社会及文化环境的影响。 …

毕业设计:日志记录编写(3/17起更新中)

目录 3/171.配置阿里云python加速镜像&#xff1a;2. 安装python3.9版本3. 爬虫技术选择4. 数据抓取和整理5. 难点和挑战 3/241.数据库建表信息2.后续进度安排3. 数据处理和分析 3/17 当前周期目标&#xff1a;构建基本的python环境&#xff1a;运行爬虫程序 1.配置阿里云pytho…

B端设计:如何让UI组件库成为助力,而不是阻力。

首发2023-09-24 15:42贝格前端工场 Hi&#xff0c;我是大千UI工场&#xff0c;网上的UI组件库琳琅满目&#xff0c;比如elementUI、antdesign、iview等等&#xff0c;甚至很多前端框架&#xff0c;也出了很多UI组件&#xff0c;如若依、Layui、bootstrap等等&#xff0c;作为U…

工具分享丨分析GreatSQL Binglog神器

在GreatSQL中&#xff0c;Binlog可以说是 GreatSQL 中比较重要的日志了&#xff0c;在日常开发及运维过程中经常会遇到。Binlog即Binary Log&#xff0c;二进制日志文件&#xff0c;也叫作变更日志&#xff08;Update Log&#xff09;。 详细Binglog日志介绍 Binglog主要应用…

包含多个段的程序

文章目录 包含多个段的程序在代码段中使用数据在代码段中使用栈将数据、代码、栈放入不同的段 包含多个段的程序 在代码段中使用数据 考虑这样一个问题&#xff0c;编程计算以下8个数据的和&#xff0c;结果存在ax 寄存器中&#xff1a;0123H&#xff0c;0456H&#xff0c;07…

性能测试-Jmeter中IF控制器使用

一、Jmeter控制器 分为两种类型&#xff1a; 控制测试计划执行过程中节点的逻辑执行顺序&#xff0c;如&#xff1a;循环控制器&#xff0c;if控制器等对测试计划中的脚本进行分组&#xff0c;方便Jmeter统计执行结果以及进行脚本的运行时控制等&#xff0c;如&#xff1a;吞…

Mysql数据库的SQL语言详解

目录 一、数据库的基础操作 1、数据库的基本查看和切换 1.1 查看数据库信息 1.2 切换数据库 1.3 查看数据库中的表信息 1.4 查看数据库或数据库中表的结构&#xff08;字段&#xff09; 1.5 数据类型 1.5.1 整数型 1.5.2 浮点型(float和double) 1.5.3 定点数 1.5.4…

【郭林保大夫】——这些事情做到了,想患上帕金森都难!

郭林保大夫说&#xff1a;帕金森病的发病原因尚不完全清楚&#xff0c;但可能与多种因素有关&#xff0c;包括遗传因素、环境因素、神经系统老化等。具体病因可能是这些因素相互作用的结果。病情后期&#xff0c;严重程度会因个体差异而异。一些患者可能出现严重的运动障碍&…

Gelato Network的创始人HILMAR ORTH确认出席HackSummit2024区块链开发者大会

随着Web3技术的日新月异&#xff0c;区块链领域正以前所未有的速度席卷全球。在这一变革的浪潮中&#xff0c;备受瞩目的区块链盛会——Hack.Summit() 2024区块链开发者大会&#xff0c;将于2024年4月9日至10日&#xff0c;在香港数码港隆重登场。这一里程碑式的大会不仅标志着…

栈、队列——练习题

1. ✌有效的括号 代码实现&#xff1a; 方法一&#xff1a;括号匹配 在任意一个位置上&#xff0c;左括号数量 > 右括号数量在最后一个位置上&#xff0c;左括号数量 右括号数量 方法二&#xff1a;栈 bool isValid(char* s) {char stack[10000];int top -1;while (*s) {i…

数据结构·排序

1. 排序的概念及运用 1.1 排序的概念 排序&#xff1a;排序是将一组“无序”的记录序列&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减归零调整为“有序”的记录序列的操作 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同关键字的记…

机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】

目录 前言 一、什么是线性回归 二、什么是逻辑回归 三、基于Python 和 Scikit-learn 库实现线性回归 示例代码&#xff1a; 使用线性回归来预测房价: 四、基于Python 和 Scikit-learn 库实现逻辑回归 五、总结 线性回归的优缺点总结&#xff1a; 逻辑回归&#xff08;Logistic…

RabbitMQ 的高阶应用及可靠性保证

目录 一、RabbitMQ 高阶应用 1.1 消息何去何从 1.2 过期时间 1.3 死信队列 1.4 延迟队列 1.5 优先级队列 1.6 消费质量保证&#xff08;QOS&#xff09; 二、持久化 三、生产者确认 四、消息可靠性和重复消费 4.1 消息可靠性 4.2 重复消费问题 上篇文章介绍了 Rabb…

QT----给程序添加上任务栏托盘图标和退出

让我们的程序拥有任务栏托盘图标&#xff0c;实现程序后台运行&#xff0c;退出等功能 1、关闭程序保持后台 重写关闭事件,忽略点击窗口关闭 void MainWindow::closeEvent(QCloseEvent *event) {// 隐藏窗口&#xff0c;而不是真正关闭setVisible(false);// 忽略关闭事件&am…

由浅到深认识Java语言(26):阶段性练习

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

后端如何返回404地址

当我们网站输入不存在的地址&#xff0c;经常会出现404的页面&#xff0c;这是如何做到的 1.添加配置 spring:mvc:view:prefix: /templates/suffix: .html 2.resources下添加templates目录&#xff0c;下面放404的网站 3.添加依赖&#xff0c;版本在主pom里面配置好了&#x…

一个开源的分布式在线教育系统

项目介绍 roncoo-education —— 一个分布式在线教育系统。目前主要功能有课程点播功能&#xff0c;支持多家视频云的接入&#xff0c;课程附件管理功能&#xff0c;支持多家存储云的接入&#xff0c;可以帮助个人或者企业快速搭建一个轻量级的在线教育平台。 系统分为后台、前…

CHAT~(持续更新)

CHAT&#xff08;持续更新&#xff09; 实现一个ChatGPT创建API设计页面布局业务操作技术架构 编码其他 实现一个ChatGPT 创建API 最简单也最需要信息的一步 继续往下做的前提 此处省略&#xff0c;想要获取接口创建方式联系 设计 页面布局 按照官网布局 业务操作 注册登…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…