更强的并行处理能力
JSR 166y是一个修订版JSR,它带给我们J2SE 5.0中所有java.util.concurrent的优点,以及Java SE 6中的全部更新。JSR 166y中的主要新增功能,是一个叫做fork/join的新并行处理包。尤其值得一提的是,fork/join提供了对分而治之算法的支持。fork/join库的核心是一个叫做ForkJoinPool的新类和实现问题分解的一系列任务类型。
多数典型应用一般不使用一个框架来解决计算密集型的分而治之算法。但是,JSR 166y还提供了一个新的功能式API,实现数组的并行处理。ParallelArray是一个可用于fork/join算法的数据结构,它提供了一个通用目的API,以高度并发的方式执行数据集的搜索、过滤和转换。其真正好处是,这些操作可以通过ForkJoinPool并行执行,在将来的多核计算时代,可以无需修改函数即可自动充分利用多核处理能力。至于ParalleArray是作为JDK的一部分包含在Java SE 7中,还是将作为一个外部库发布,现在尚处于考虑之中。
Listing 3演示了如何使用ParalleArray来管理donuts的大量集合。
Listing 3
ForkJoinPool fj = new ForkJoinPool(16);
Donut[] data = ...
ParallelArray donuts = new ParallelArray(fj, data);
// Filter
Ops.Predicate hasSprinkles = new Ops.Predicate() {
public boolean op(Donut donut) {
return donut.hasSprinkles();
}
};
// Map from Donut -> Integer
Ops.Predicate daysOld = new Ops.ObjectToInt() {
public int op(Donut donut) {
return donut.age();
}
};
SummaryStatistics summary =
orders.withFilter(hasSprinkles)
.withMapping(daysOld)
.summary();
System.out.println("with sprinkles: " + summary.size());
System.out.println("avg age: " + summary.average());
J2SE 5.0中引入的并行功能和其在Java SE 6中的改进,为我们在4核或8核服务器上编写并行应用程序提供了坚实的基础。而fork/join库则又向前更深入了一步,可以支持更多处理器的应用程序编写,诸如未来几年中我们将使用的16核到32核计算机。它缓解了我们所面临的并行计算问题,但并未真正解决它。现在业界中的每一个人都在寻找可以利用多核世界进行编程的方法。尽管Java在此方面有一定领先优势,但共享状态的并发编程不可能在未来十年中都满足所有需求。Fork/join只是进一步的尝试。