Java 中的并行流

10 Sept 2024 | 5 分钟阅读

Java 8(或更高版本)的一个突出特点是 Java 并行流。它旨在利用处理器的多个核心。通常,任何 Java 代码只有一个处理流,它是顺序执行的。然而,通过使用并行流,可以将 Java 代码分成多个流,这些流在各自的核心上并行执行,最终结果是将各个结果组合在一起。它们的执行顺序不受我们控制。因此,建议在单个项目的执行顺序不影响最终结果时使用并行流。

并行流分析

为了提高程序的性能,引入了并行流。然而,这并不能保证应用并行流就能提升结果。例如,可能会出现代码必须按特定顺序执行的情况。在某些情况下,我们需要代码按特定顺序执行,在这种情况下,需要使用顺序流而不是并行流。

创建流的不同方法

有两种创建方式,如下列出并稍后描述:

  1. 在流上使用 parallel() 方法
  2. 在 Collection 上使用 parallelStream()

在流上使用 parallel() 方法

BaseStream 接口的 parallel() 方法返回一个等效的并行流。让我们通过一个例子来理解它的工作原理。

文件名: ParallelStream.java

输出 1

Vestibulum urna lacus, eleifend venenatis ipsum at, venenatis fringilla mauris.
Fusce nulla augue, convallis at velit ac, pulvinar convallis eros.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed ut ipsum molestie dolor dictum luctus.
Maecenas interdum erat feugiat rhoncus mattis. Phasellus facilisis ex non magna faucibus mollis.
Vestibulum eu tellus nec lectus rutrum ornare ac tincidunt sem.

说明: 在上面的程序中,我们创建了一个文件对象,指向系统中已存在的 `parallelstream.txt` 文件。之后,创建了一个流,该流从文本文件中读取(一次一行)。然后我们调用 `parallel()` 方法在控制台显示 `parallelstream.txt` 的内容。请注意,每次执行上述代码时,执行顺序都不同。再次执行代码,将在控制台上显示以下输出:

输出 2

Fusce nulla augue, convallis at velit ac, pulvinar convallis eros.
Vestibulum urna lacus, eleifend venenatis ipsum at, venenatis fringilla mauris.
Maecenas interdum erat feugiat rhoncus mattis. Phasellus facilisis ex non magna faucibus mollis.
Vestibulum eu tellus nec lectus rutrum ornare ac tincidunt sem.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed ut ipsum molestie dolor dictum luctus.

在 Collection 上使用 parallelStream()

parallelStream() 方法是 Collection 接口的一部分,并返回一个以 collection 为源的并行流。它的工作原理在以下示例中进行了说明。

文件名: ParallelStream.java

输出 1

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed ut ipsum molestie dolor dictum luctus.
Vestibulum urna lacus, eleifend venenatis ipsum at, venenatis fringilla mauris.
Maecenas interdum erat feugiat rhoncus mattis. Phasellus facilisis ex non magna faucibus mollis.
Fusce nulla augue, convallis at velit ac, pulvinar convallis eros.
Vestibulum eu tellus nec lectus rutrum ornare ac tincidunt sem.

说明: 在上述代码中,我们正在使用并行流。但是,我们正在使用 List 来读取 `parallelstream.txt` 文件。因此,需要 `parallelstream()` 方法。

并行执行流的其他示例

让我们看一些并行执行流的更多示例。

文件名: ParallelStream1.java

输出

In Normal
1
2
3
4
5
In Parallel
3
5
4
2
1

让我们看另一个例子。

文件名: ParallelStream2.java

输出

In Normal
1
2
3
4
5
In Parallel
3
5
4
2
1

Java 程序检查流是否正在并行运行

我们还可以检查流是否正在并行运行。

文件名: ParallelStream3.java

输出

In Normal
The stream is not running parallelly.
1
2
3
4
5
In Parallel
The stream is running parallelly.
3
5
4
1
2