Doug Lea的jsr166y,主要体现在Fork/Join模式,分而治之,然后合并结果,这么一种编程模式。相比JDK 1.6内置的JUC并发框架,更加细粒度。虽然已经内置JDK 1.7中,但本文环境基于JDK 1.6,因此在相关包的引用方面,差异在于包的路径。
有关Fork/Join的一些摘抄:
fork/join框架是一个“多核友好的、轻量级并行框架 ”,它支持并行编程风格,将问题递归拆分成多个更小片断,以并行和调配的方式解决。Fork-join融合了分而治之技术;获取问题后,递归地将它分成多个子问题,直到每个子问题都足够小,以至于可以高效地串行地解决它们。递归的过程将会把问题分成两个或者多个子问题,然后把这些问题放入队列中等待处理(fork步骤),接下来等待所有子问题的结果(join步骤),把多个结果合并到一起。
Doug Lea描述了fork/join框架最可能的使用场景和采用过程:
总之,我期望其使用曲线与其他并发工具雷同。最初,只有较少真正需要的人使用它们,但最终很难找到不依赖于它们的程序,它们常常深埋在底层基础架构组件中。因此,表面语法支持可能并不是那么重要——类库/组件开发者越是想合并它们,其用法越是表现的笨拙。
理想的情况下,有几个使用层次:
1. “并行做事”层次,语言或工具翻译成并行代码,同时检查安全性/活跃性。这仍部分处于研究领域。
2. 安排集合的并行操作。——map、reduce、apply等等。那些想使用一次性操作特性操纵集合的程序员们,可以使用这些特性来提高常用处理类型的速度。(这是ListTasks、ArrayTasks等等层次)
3. 手工生效forkjoin以解决特定问题。这是我正在全力投入的层次,以确保我们可能使用工作窃取框架来支持范围广泛的并行算法。(当前一些怪模怪样的和缺乏解释的方法,如isQuiescent是为这种高级用法设计的。多数程序只使用“fork”和“join”,但当你需要其他这些方法时,它们也被提供了。)
4. 扩展框架以创建新类型的ForkJoinTasks等等。例如,那些需要事务的操作。只有很少量的人(例如,或许是Fortress运行时类库开发者)需要这么做,但是需要有足够的基础扩展钩子来才能做好。
本文开始学习,按照心得步骤一步一步进行学习。即将开始。
在相关项目中加入jsr166y.jar依赖即可。
必备条件:JDK 1.6
机器配置:
操作系统 Windows XP 专业版 32位 SP3
处理器 英特尔 Pentium(奔腾) P6200 @ 2.13GHz
内存 4 GB ( 金士顿 DDR3 1333MHz / 三星 DDR3 1333MHz )