和阿里P8大佬面试对杀一小时的Fork/Join原理

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

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

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

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

  • 任务分解

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

  • 结果合并

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

就像官僚制度一样:

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

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

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

  • Fork对应分治任务模型里的任务分解
  • Join对应结果合并

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

  • 分治任务的线程池ForkJoinPool
  • 分治任务ForkJoinTask

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

ForkJoinTask

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

  • fork()

异步执行一个子任务

  • join()

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

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

  • RecursiveAction#compute()无返回值
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章