我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Fork跟Join原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Fork跟Join原理是什么

这篇文章将为大家详细讲解有关Fork跟Join原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Fork跟Join原理是什么

只听到P8大佬不急不慢问道:谈谈对JDK并发工具的认识?

我开始仔细梳理多年的并发八股文经验,道:

线程池、Future、CompletableFuture和CompletionService这些并发工具都是帮助SE站在任务角度解决并发问题,而非纠结于线程之间协作的细节,比如线程之间如何实现等待、通知。

  • 简单并行任务

线程池+Future 组合拳

  • 任务间有聚合关系

AND、OR聚合,CompletableFuture 一招鲜

  • 批量的并行任务

CompletionService 一把梭

并发编程可分为三个层面问题:分工、协作、互斥。

当关注于任务时,你会发现你的视角已跃出并发编程细节,而使用现实世界思维模式,类比现实世界的分工,其实线程池、Future、CompletableFuture和CompletionService都可列为分工问题。

  • 简单并行任务、聚合任务和批量并行任务的现实的工作流程图

Fork跟Join原理是什么

这三种任务模型,基本覆盖日常工作中的并发场景,但其实还有一种“分治”任务模型。

分治,分而治之,一种解决复杂问题的思维方法和模式。把一个复杂问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解。理论上解决每一个问题都对应着一个任务,所以对于问题的分治,实际上就是对于任务的分治。

P8 大佬直接开问,那你说说什么是分治任务模型?

分治任务模型可分为两个阶段:

  • 任务分解

将任务迭代地分解为子任务,直至子任务可计算出结果。将地区具体事务分属各个地方行政官。

  • 结果合并

逐层合并子任务的执行结果,直至获得最终结果。各地方行政官最终将治理成果汇报上级。

就像官僚制度一样:

Fork跟Join原理是什么

那你平时开发是如何使用Fork/Join的?

我,我平时还真没通过啊,就背过。还好这道题,我面试前也准备了…

Fork/Join是一个并行计算框架,以支持分治任务模型

  • Fork对应分治任务模型里的任务分解

  • Join对应结果合并

Fork/Join计算框架主要包含两部分:

  • 分治任务的线程池ForkJoinPool

  • 分治任务ForkJoinTask

这俩的关系类似于 ThreadPoolExecutor 和  Runnable,都是提交任务到线程池,只不过分治任务有自己独特的任务类型ForkJoinTask。

ForkJoinTask

JDK7 提供,一个抽象类,核心方法如下:

  • fork()

异步执行一个子任务

  • join()

阻塞当前线程来等待子任务的执行结果

ForkJoinTask有两个子类——RecursiveAction和RecursiveTask,显然都是用递归处理分治任务。这两个子类都定义了抽象方法compute():

  • RecursiveAction#compute()无返回值

Fork跟Join原理是什么

  • RecursiveTask#compute()有返回值

Fork跟Join原理是什么

注意到这俩类都是抽象类,使用要定义子类实现。

Fork跟Join原理是什么

只见 P8 开始冷笑,看来要问源码级别原理了!

那你说下Fork/Join的工作原理

还好我知道阿里面试套路,凡是 java 工具,必问深入的源码。

因为Fork/Join的核心就是ForkJoinPool,让我来深入讲解ForkJoinPool原理。

ThreadPoolExecutor本质是个生产者-消费者实现,内部有一个任务队列,作为生产者和消费者的通信媒介。ThreadPoolExecutor可以有多个工作线程,这些工作线程都共享一个任务队列。

ForkJoinPool本质上也是一个生产者-消费者的实现,但更智能

  • ForkJoinPool工作原理图

Fork跟Join原理是什么

ThreadPoolExecutor内部只有一个任务队列,而ForkJoinPool内部有多个任务队列,当调用ForkJoinPool#invoke()或submit()提交任务时,ForkJoinPool把任务通过路由规则提交到一个任务队列,如果任务在执行过程中会创建出子任务,那么子任务会提交到工作线程对应的任务队列。

如果工作线程对应的任务队列空,是不是就没活儿干了?

No!ForkJoinPool有个“任务窃取”机制,若工作线程空闲了,它会“窃取”其他工作任务队列里的任务,例如刚才那个图中,线程T2对应任务队列已空

那它会“窃取”线程T1对应的任务队列的任务。这样所有工作线程都不会闲着。

ForkJoinPool的任务队列采用的是双端队列,工作线程正常获取任务和“窃取任务”分别从任务队列不同的端消费,这也能避免很多不必要的数据竞争。

ForkJoinPool支持任务窃取机制,能够让所有线程的工作量基本公平,不会出现线程有的很忙,有的一直在摸鱼,所以性能很好,是个很公正的领导。

Java8的Stream API里面并行流也是基于ForkJoinPool。

默认,所有的并行流计算都共享一个ForkJoinPool,这个共享的ForkJoinPool的默认线程数是CPU核数;

若所有并行流计算都是CPU密集型,完全没有问题,但若存在I/O密集型并行流计算,那很可能因为一个很慢的I/O计算而拖慢整个系统的性能。所以建议用不同ForkJoinPool执行不同类型的计算任务。

关于Fork跟Join原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Fork跟Join原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

fork/join的设计思路是什么

本篇内容主要讲解“fork/join的设计思路是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“fork/join的设计思路是什么”吧!1、fork/join的设计思路了解一个框架的第一件事,
2023-06-16

JDK 7中的Fork或Join模式是什么

本篇文章为大家展示了JDK 7中的Fork或Join模式是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。介 绍随着多核芯片逐渐成为主流,大多数软件开发人员不可避免地需要了解并行编程的知识。而同
2023-06-17

linux中fork的实现原理是什么

在Linux中,fork是创建新进程的系统调用之一。当调用fork系统调用时,操作系统会复制当前进程的所有资源(包括代码、数据、堆栈等)来创建一个新的进程,这个新的进程称为子进程。子进程是原始进程的副本,它从fork调用返回的地方开始执行。
2023-09-11

Apache Doris Colocate Join原理是什么

这篇文章主要介绍“Apache Doris Colocate Join原理是什么”,在日常操作中,相信很多人在Apache Doris Colocate Join原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
2023-07-04

浅谈mysql join底层原理是什么

本篇内容主要讲解“浅谈mysql join底层原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“浅谈mysql join底层原理是什么”吧!目录join算法驱动表和非驱动表的区别1、Sim
2023-06-20

CSS鼠标跟随的原理是什么

这篇文章主要介绍了CSS鼠标跟随的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS鼠标跟随的原理是什么文章都会有所收获,下面我们一起来看看吧。说明1、鼠标跟随就是元素会跟随着鼠标的移动,而作出相对
2023-06-30

如何进行JDK7新特性中fork/join框架的原理分析

如何进行JDK7新特性中fork/join框架的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。原理解析:fork分解,join结合。这个框架的本质是将一个任务分解成多个
2023-06-17

MYSQL数据库中Join的操作原理是什么

今天就跟大家聊聊有关MYSQL数据库中Join的操作原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Join使用的是Nested-Loop Join算法,Nested-Loo
2023-06-20

git中的fork是指什么

这篇文章主要介绍“git中的fork是指什么”,在日常操作中,相信很多人在git中的fork是指什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”git中的fork是指什么”的疑惑有所帮助!接下来,请跟着小编
2023-06-26

mysql中的join是什么

mysql 中的 join 是用于组合不同表数据的查询命令,它通过匹配列创建临时表。join 有四种类型:inner join(仅匹配两表中都存在的行)、left join(选择左表所有行)、right join(选择右表所有行)和 ful
mysql中的join是什么
2024-04-29

UNIX中fork()函数的作用是什么

UNIX中的fork()函数用于创建一个新的进程。在调用fork()函数之后,操作系统会创建一个与原进程完全相同的新进程,包括代码、数据、堆栈和文件描述符等。新进程被称为子进程,原进程被称为父进程。fork()函数的作用是复制父进程的所有资
2023-09-11

immer.js原理是什么

这篇文章主要介绍了immer.js原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇immer.js原理是什么文章都会有所收获,下面我们一起来看看吧。但如果拷贝的是一个树形结构,层次比较深,看是一个对象,
2023-07-05

编程热搜

目录