读书人

Java 七 Fork/Join 框架

发布时间: 2013-10-23 11:39:13 作者: rapoo

Java 7 Fork/Join 框架

Java 7 Fork/Join 实例

本节中,我们将描述一个通过Java 7引入的Fork/Join框架进行n个自然数求和的例子。如前所述,本例的目的是将n个自然数求和的计算工作分解为更小的计算单元,再合并得出最终结果。检验和数的逻辑保持不变。
计算过程的基本原则是将n划分为更小的值来分别独立计算和数。整个遍历过程包括将n划分为1到n/2和(n+2)+1到n两部分,以及分别计算每一部分的和。

ForkJoinTask类如下定义:

Java 七 Fork/Join 框架

EvaluateSumForkJoinTask 类扩展自递归结果处理类RecursiveTask,用于创建ForkJoinTask实例。RecursiveTask是泛型类,本例中设置为 Integer。EvaluateSumForkJoinTask重载了compute ()方法,该方法负责创建出新的任务分支,并合并计算结果。

既然主要问题可以被分解为两个大块,我们就创建两个工作者线程myWorker1和myWorker2,分别分配较小的n值给它们。一旦n值被减小到2,任务就没必要再并行化分解了。并行化停止条件可以根据具体的n值进行调整,以达到更好的并行效果。

客 户端类用于管理ForkJoinPool,并负责调用主任务。ForkJoinPool实例基于当前硬件条件下可用处理器数量进行配置。示例程序运行的机 器配有一个含2个处理器单元的双核处理器上。invoke()方法将对检验前n个(500个)自然数和的任务进行分解,该任务会轮流调用 EvaluateSumForkJoinTask类的compute()方法,EvaluateSumForkJoinTask类也扩展自 RecursiveTask。

Java 七 Fork/Join 框架

计算结果比较

使用Fork/Join的计算过程由多个工作者线程代理,共同工作以计算和数。其计算结果和单线程的实现模式相比较得出以下结果:

N值

单线程模型耗时 (ms)

分支/合并模型耗时 (ms)

备注

20

4

7

本例中,分支/合并模型由于较小的n值耗时较长。对于非常小规模的问题而言,并行化未必值得。

100

15

6

在这三个例子中,分支/合并模型由于使用了多处理器核心导致耗时较短。

500

124

6

1000

285

7

值得关注的一点是,单线程模型中CPU利用率比Fork/Join模型要小,如下所示:
单线程模型

Java 七 Fork/Join 框架

结论

本 文通过单线程模型到Java 7引入的Fork/Join模型的演化,讨论了Java平台并行的编程特性。Java 5引入的Executor是一大进步,但由于其阻塞特性无法被应用于并行计算。因此Java 7引入的Fork/Join框架扮演了重要角色。本文通过一个非常简单的例子解释了并发及并行编程的概念,并通过两种方式结果数据的比较得出结论。

致谢

作者真诚感谢Subrahmanya先生,SV, VP, ECOM 研究组,以及E&R的指导,支持以及不断的鼓励,同事真心感谢Piram先生的审阅。

Nitin KL.

Nitin 先生是Infosys公司的技术主管,在Java EE技术方面有非常丰富的知识,致力于使用Hibernate, iBATIS及JPA框架的Java EE应用设计与开发工作。Nitin先生已经为Devx撰写过许多在线文章,可以通过KL_Nitin@infosys.com联系到他。

Sangeetha S.

S Sangeetha女士是Infosys公司电子商务研究室的高级技术架构师。她拥有超过14年的Java及Java EE应用设计开发经验。她是一本J2EE架构著作的作者之一,同时也为JavaWorld,java.net,Devx等撰写了许多在线文章,她的联系方 式为sangeethas@infosys.com。

译者注:

本 文是作者承接其另一篇讨论Java多线程及并行计算的文章(Java多线程及并行计算的挑战)而作的,本文也涉及了该文的部分概念,该文文原文可见 http://www.developer.com/java/java-multi-threading-and-the-challenges- of-parallel-computing.html。

英文原文:developer,编译:ImportNew - 郑玮

译文链接: http://www.importnew.com/2279.html

读书人网 >编程

热点推荐