第 7 章 并行数据处理与性能

本章内容

  • 用并行流并行处理数据
  • 并行流的性能分析
  • 分支/合并框架
  • 使用Spliterator分割流

通过前面三章,我们已经知道新的Stream接口能让你以声明的方式操纵数据集。我们还解释了由外部迭代切换到内部迭代后,原生Java库可以更好地控制流元素的处理。为加速数据集的处理,往往需要进行额外的显式优化,新的方式将Java程序员从之前的优化工作中解脱了出来。迄今为止,使用Stream最重要的好处是现在能对这些集合执行操作流水线,可以充分利用计算机的多个核了。

例如,Java 7之前,要对集合数据执行并行处理非常麻烦。第一,你得明确地把包含数据的数据结构拆分成若干子部分。第二,你要给每个子部分分配一个独立的线程。第三,你需要在恰当的时候对它们进行同步来避免不希望出现的竞争条件,等待所有线程完成,最后把这些部分结果合并起来。Java 7引入了一个名为“分支/合并”的框架,能让这些操作更稳定、更不易出错。7.2节会探讨这一框架。

在本章中,你将了解Stream接口如何让你不太费力就能对数据集执行并行操作。它允许你声明性地将顺序流转变成并行流。此外,你还将了解Java是如何做到这一点的,或者更确切的说,流是如何在幕后应用Java 7引入的分支/合并框架的。你还会发现,了解并行流内部是如何工作的很重要,因为如果你忽视这一方面,就可能因误用而得到意外的结果,而这个意外结果极有可能是错误的。

并行处理各个数据块之前,并行流会被划分为一系列的数据块,我们会特别演示某些切分方式在一定情况下恰恰是造成无法解释错误结果的根源。藉此,你将会了解如何通过实现和使用自己的Spliterator来控制这个划分过程。