这三种任务模型,基本覆盖日常工作中的并发场景,但其实还有一种“分治”任务模型。
分治,分而治之,一种解决复杂问题的思维方法和模式。把一个复杂问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解。理论上解决每一个问题都对应着一个任务,所以对于问题的分治,实际上就是对于任务的分治。
P8 大佬直接开问,那你说说什么是分治任务模型?
分治任务模型可分为两个阶段:
- 任务分解
将任务迭代地分解为子任务,直至子任务可计算出结果。将地区具体事务分属各个地方行政官。
- 结果合并
逐层合并子任务的执行结果,直至获得最终结果。各地方行政官最终将治理成果汇报上级。
就像官僚制度一样:
那你平时开发是如何使用Fork/Join的?
我,我平时还真没通过啊,就背过。还好这道题,我面试前也准备了…
Fork/Join是一个并行计算框架,以支持分治任务模型
- Fork对应分治任务模型里的任务分解
- Join对应结果合并
Fork/Join计算框架主要包含两部分:
- 分治任务的线程池ForkJoinPool
- 分治任务ForkJoinTask
这俩的关系类似于 ThreadPoolExecutor 和 Runnable,都是提交任务到线程池,只不过分治任务有自己独特的任务类型ForkJoinTask。
ForkJoinTask
JDK7 提供,一个抽象类,核心方法如下:
- fork()
异步执行一个子任务
- join()
阻塞当前线程来等待子任务的执行结果
ForkJoinTask有两个子类——RecursiveAction和RecursiveTask,显然都是用递归处理分治任务。这两个子类都定义了抽象方法compute():
- RecursiveAction#compute()无返回值