首页 > 编程语言 >并发编程工具集——Fork/Join-上(三十六)

并发编程工具集——Fork/Join-上(三十六)

时间:2024-09-24 10:22:52浏览次数:9  
标签:Fork Join 分治 工具集 任务 线程 任务模型

简述

  1. 前面提到的线程池、Future、CompletableFuture 和 CompletionService,这些工具类都是在帮助我们站在任务的视角来解决并发问题,而不是让我们纠缠在线程之间如何协作的细节上(比如线程之间如何实现等待、通知等)。
  2. 精髓:对于简单的并行任务,你可以通过“线程池 +Future”的方案来解决;如果任务之间有聚合关系,无论是 AND 聚合还是 OR 聚合,都可以通过 CompletableFuture 来解决;而批量的并行任务,则可以通过 CompletionService 来解决。
  3. 并发编程可以分为三个层面的问题,分别是分工、协作和互斥,线程池、Future、CompletableFuture 和 CompletionService 都可以列到分工里面。
  4. 分治:顾名思义,即分而治之,是一种解决复杂问题的思维方法和模式;
    • 具体来讲,指的是把一个复杂的问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解。
    • 理论上来讲,解决每一个问题都对应着一个任务,所以对于问题的分治,实际上就是对于任务的分治。
  5. 分治思想应用广泛,例如算法领域有分治算法(归并排序、快速排序都属于分治算法,二分法查找也是一种分治算法);大数据领域知名的计算框架 MapReduce 背后的思想也是分治。
  6. Java 并发包里提供了一种叫做 Fork/Join 的并行计算框架,就是用来支持分治这种任务模型的。

分治任务模型

  1. 分治任务模型可分为两个阶段:一个阶段是任务分解,也就是将任务迭代地分解为子任务,直至子任务可以直接计算出结果;另一个阶段是结果合并,即逐层合并子任务的执行结果,直至获得最终结果。
  2. 在这个分治任务模型里,任务和分解后的子任务具有相似性,这种相似性往往体现在任务和子任务的算法是相同的,但是计算的数据规模是不同的。具备这种相似性的问题,我们往往都采用递归算法。

Fork/Join 的使用

  1. Fork/Join 是一个并行计算的框架,主要就是用来支持分治任务模型的,这个计算框架里的 Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。
  2. Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。
  3. 这两部分的关系类似于 ThreadPoolExecutor 和 Runnable 的关系,都可以理解为提交任务到线程池,只不过分治任务有自己独特类型 ForkJoinTask。
  4. ForkJoinTask 是一个抽象类,它的方法有很多,最核心的是 fork() 方法和 join() 方法,其中 fork() 方法会异步地执行一个子任务,而 join() 方法则会阻塞当前线程来等待子任务的执行结果。
  5. ForkJoinTask 有两个子类——RecursiveAction 和 RecursiveTask:
    • 它们都是用递归的方式来处理分治任务的。
    • 这两个子类都定义了抽象方法 compute(),不过区别是 RecursiveAction 定义的 compute() 没有返回值,而 RecursiveTask 定义的 compute() 方法是有返回值的。
    • 这两个子类也是抽象类,在使用的时候,需要你定义子类去扩展。

标签:Fork,Join,分治,工具集,任务,线程,任务模型
From: https://blog.csdn.net/weixin_39384775/article/details/142331681

相关文章

  • SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法
    目录0问题场景1数据准备2问题分析2.1需求一2.2需求二3小结想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。专栏原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。数字化建设通关指南0......
  • AI工具集
    AI聊天大模型AI问答/AI写作AI办公AI设计/图片处理AI绘图AI漫画AI视频生成AI数字人AI音频生成AI装修设计ChatGPTKimi助手百度文库(PPT)360智图(图片处理)Midjourney(国外)SkyreelsRunwayHeyGenSunoCollovClaude通义千问(国产)AIPPT(PPT)美图设计室(平面设计)Midjourney(国内)......
  • ForkJoinPool
    总结一个特殊线程池,它专门用于执行ForkJoinTask;设计目的是为了更有效地处理可以被分解成更小任务的工作负载,这些任务可以通过递归地分叉(fork)和合并(join)来并行执行。这种模式非常适合于分治算法,比如快速排序、矩阵乘法等。特性工作窃取:ForkJoinPool 使用了一......
  • ThreadPoolExecutor 与 ForkJoinPool比较
    都是Java并发包java.util.concurrent中用于执行任务的线程池,但它们的设计目的和适用场景有所不同。下面是两者之间的主要区别:设计目标ThreadPoolExecutor:主要用于处理大量异步任务。适用于各种类型的任务,特别是那些独立运行且不需要相互协作的任务。提供了高度的......
  • 如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update
    如何在Fork的GitHub项目中保留自己的修改并同步上游更新?在GitHub上Fork了一个项目后,你可能会对项目进行一些修改,同时原作者也在不断更新。如果想要在保留自己修改的基础上,同步原作者的最新更新,很多人会不知所措。本文将详细讲解如何在不丢失自己改动的情况下,将上游仓库的更......
  • 【MySQL】查询语句之inner、left、right、full join 的区别
     前言:    INNERJOIN和OUTERJOIN是SQL中常用的两种连接方式,用于从两表活多表中提取相关的数据。两者区别主要在于返回的结果集如何处理匹配与不匹配的行。目录1、INNERJOIN2、OUTERJOIN3、总结1、INNERJOIN    称为内连接,只有查询的几......
  • linq中的join
    LINQ中的Join在LINQ中,Join操作符用于连接两个序列中的元素,基于给定的键匹配。Join操作符允许你根据共同的键来关联两个序列中的项,这对于处理多个相关联的数据集非常有用。代码publicclassEmployee{publicintId{get;set;}publicstringName{get;set;}......
  • Debian下必装的小工具集
    功能说明  下载链接文件管理器DoubleCommanderdoublecmd终端文件管理器LastFileManagerlfm截屏及OCR识别eSearch......
  • LEFT JOIN 与 left semi join 的区别
    好的,我再给你举一个使用HiveSQL的例子,比较`LEFTJOIN`和`LEFTSEMIJOIN`的区别,并加入测试数据。假设我们有两个表:1.`customers`表:-`customer_id`:客户ID-`customer_name`:客户名称-`customer_email`:客户邮箱2.`orders`表:-`orde......
  • 【智能终端】HBuilder X 与微信开发者工具集成与调试实战
    目录1.需求和理解库、框架、平台1.1需求1.2理解2.3库、框架、平台2.3.1库(Library)2.3.2框架(Framework)2.3.3平台(Platform)2.3.4总结2.使用HBuilderX创建第一个uni-app应用步骤1:进入DCloud 官网,下载并安装HBuilderX。步骤2:打开HBuilderX,选择新......