【框架】说一说 Fork/Join?

2024-03-25 20:04
文章标签 框架 fork join 说一说

本文主要是介绍【框架】说一说 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 的计算结果完成后将结果合并

 

这篇关于【框架】说一说 Fork/Join?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846106

相关文章

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依