Java 7 的并行支持:Fork/Join

  • R.J. Lorimer
  • 韩锴

2008 年 3 月 23 日

话题:Java语言 & 开发架构

今天,处理器的内核数量在不断增加,以什么样的方法开发程序才能发挥出新硬件的效能呢?这正变成一个愈发重要的问题摆在了开发者面前。IBM Developerworks已经发布了一篇介绍 Fork-Join 并发类库的连载文章,Fork-Join 类库会作为即将来到的 Java 7 的一部分进行发布。InfoQ 以前也报道过Java 7 中最初的 fork/join 提案,其中还包含来自最初创建者 Doug Lea 的反馈。Doug Lea在他的论文“Fork/Join Parallelism in Java”中,首次把 fork/join 的概念引入到 Java 中。Doug Lea 的 util.concurrent 包是JSR-166的基础,后者是发布在 Java 5 中的 java.util.concurrentl 类库。Fork/Join 是对 JSR-166 的简单修订。

连载文章的第一部分详细介绍了 fork-join 类库的核心概念,以及它要解决的问题:

硬件的发展趋势非常清晰;Moore 定律表明不会出现更高的时钟频率,但是每个芯片上会集成更多的内核。很容易想象让十几个处理器繁忙地处理一个粗粒度的任务边界(比如一个用户请求),但是这项技术不会扩大到数千个处理器——在这种环境下短时间内流量可能会呈指数级增长,但最终硬件趋势将会占上风。当跨入多内核时代时,我们需要找到更细粒度的并行性,否则将面临即便有许多工作需要去做而处理器却仍处于空闲的风险。如果希望跟上技术发展的脚步,软件平台也必须配合主流硬件平台的转变。最终,Java 7 将会包含一种框架,用于表示某种更细粒度级别的并行算法:fork-join 框架
第二部分深入探讨了在第一部分里定义的概念,涉及到分而治之(divide-and-conquer)的编程技术:

Fork-join 融合了分而治之技术;获取问题后,递归地将它分成多个子问题,直到每个子问题都足够小,以至于可以高效地串行地解决它们。递归的过程将会把问题分成两个或者多个子问题,然后把这些问题放入队列中等待处理(fork步骤),接下来等待所有子问题的结果(join步骤),把多个结果合并到一起。

文章接下来展示了一个使用 fork/join 实现合并排序(merge-sort)算法的示例。

这个连载系列的最后一部分介绍了 ParallelArray 类。ParallelArray 是一个可用于 fork/join 算法的数据结构,它提供了一个通用目的 API,以高度并发的方式执行数据集的搜索、过滤和转换。

从事Java 的 BGGA 闭包提案的团队已经采纳了 fork-join 框架与闭包协同工作。他们还在站点上提供了一个可以工作的实现。Developerworks 上的那篇连载文章列举了两个使用 ParallelArray 类的例子,它们之间的区别在于是否使用了闭包:

下面的例子是查找一组学生中最好的 GPA,它用到了当前 Java 7 的 fork/join 提案:

ParallelArray students = new ParallelArray(fjPool, data);

double bestGpa = students.withFilter(isSenior)

.withMapping(selectGpa)

.max();

public class Student {



String name;

int graduationYear;

double gpa;

}

static final Ops.Predicate isSenior = new Ops.Predicate() {



public boolean op(Student s) {

return s.graduationYear == Student.THIS_YEAR;

}

};

static final Ops.ObjectToDouble selectGpa = new Ops.ObjectToDouble() {



public double op(Student student) {

return student.gpa;

}

};

下面的例子与上面的相同,不过使用了 BGGA 闭包提案:

double bestGpa = students.withFilter({Student s => (s.graduationYear == THIS_YEAR) })

.withMapping({ Student s => s.gpa })

.max();

根据当前的状况估计,Java 7 会在 2009 年早期发布。

查看英文链接:Parallelism with Fork/Join in Java 7

Java语言 & 开发架构