Java 并发之 Fork/Join

一、概述

Fork/join是java提供的并行执行的框架。其核心是:把一个大人物分割成若干小人物,再把小任务执行结果合并到大任务 。具体说:Fork把大任务切分成若干小任务并行执行,join把小任务的执行结果进行合并,得到大任务的结果。

通过使用 Doug Lea 提供的 Fork/Join 框架,软件开发人员只需要关注任务的划分和中间结果的组合就能充分利用并行平台的优良性能。其他和并行相关的诸多难于处理的问题,例如负载平衡、同步等,都可以由框架采用统一的方式解决。这样,我们就能够轻松地获得并行的好处而避免了并行编程的困难且容易出错的缺点。

二、适用范围

如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适合用 Fork/Join 模式来解决。
folk_join

三、示例

以计算Fibonacci为例,Fibonacci 的返回值为 Integer 类型。其?compute()?函数首先建立两个子任务,启动子任务执行,阻塞以等待子任务的结果返回,相加后得到最终结果。同样,当子任务足够小时,通过查表得到其结果,以减小因过多地分割任务引起的性能降低。其中,用到了 RecursiveTask 提供的方法?fork()?和?join()。它们分别表示:子任务的异步执行和阻塞等待结果完成。

其中在实现的compute方法中,一般做的事情就是如果任务最够小就直接执行,否则,切分成子任务,调用子任务的fork方法,则执行子任务的compute方法。如果子任务不用切割,则执行子任务并等待返回结果。join方法会等待任务执行完毕并取得其返回结果。

执行的过程是使用ForkJoinPool提交RecursiveTask并获取结果。

 

在以上代码中, ForkJoinPool由ForkJoinTask数组和ForkJoinWorkThread数组组成,ForkJoinTask数组负责接收提交的任务,ForkJoinWorkThread负责执行这些任务。

当调用ForkJointask的fork方法时,调用ForkJoinWorkThread的pushTask方法,pushTask方法把当前人存放到ForkJoinTask数组里,然后调用ForkJoinPool的signalWork方法唤醒或者创建一个工作线程来执行任务。

ForkJoinTask的join方法的作业时阻塞当前线程并且等待获取结果。

完。

?参考:

代码在JDK 7 中的 Fork/Join 模式的计算Fibonacci的代码上做了修改。

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: Java 并发之 Fork/Join


Trackbacks/Pingbacks

  1. fork/join计算Fibonacci数测试性能问题 | idouba - 2017年1月10日

    […] 在Java 并发之 Fork/Join一文中尝试了一个计算Fibonacci数的例子。即根据Fibonacci数的 […]

发表评论