Java 并行流示例

17 Mar 2025 | 4 分钟阅读

并行流是在Java 8或更高版本中引入的。它是函数式编程的一部分。利用并行流的特性,我们可以利用处理器的多个核心。Java 中的任何流都可以轻松地从顺序流转换为并行流。在本节中,我们将讨论Java 中的并行流是什么以及在 Java 中实现并行流的方法。

Java 中的并行流是什么?

通常,Java 代码具有一个按顺序执行的处理流。另一方面,通过使用并行流,我们可以将代码块分成在多个核心上并行执行的流。最终结果是不同结果(输出)的组合。请注意,执行顺序并不重要,也不在我们手中。它广泛用于 lambda 表达式。

并行流(flow)是支持各种函数并旨在产生可靠输出的对象流。它不是数据结构,因此不允许用户从 Collection、Arrays 和其他 API 输入数据。

请注意,它不会改变功能的实际行为,而是根据管道提供输出。

Java Parallel Stream Example

因此,建议我们在不考虑执行顺序且结果不受影响的情况下使用并行流。另外,值得注意的是,一个元素的状态不会影响另一个元素,数据源本身也不会受到影响。

为什么要使用并行流?

并行流的功能是为了提高程序的性能而引入的。但并非总是有效,因为在各种情况下我们需要按特定顺序执行过程。在这种情况下,我们可以有效地使用顺序执行来以经济高效的性能完成任务。

顺序流和并行流之间的唯一区别仅与大规模程序或复杂程序有关。对于小型程序可能无效。因此,我们必须考虑并行流,因为顺序流表现不佳。

当流并行执行时,运行时期间的过程会被划分为多个子流,聚合操作并行地遍历这些子流的过程,然后合并结果。请注意,当我们创建流时,除非我们指定,否则它始终是串行流。

  • 它可用于聚合函数。
  • 它能快速遍历大型集合。
  • 如果开发人员对顺序流有性能方面的考虑,可以使用它。
  • 如果环境不是多线程的,那么并行流会创建一个线程,并可能影响新进来的请求。

并行流的属性

  • 它不会影响其他并行流。
  • 它不会影响通用的 Fort Join 池用户。
  • 由于其他通用 fork-join 池负载,它减少了不可预测的延迟。
  • 调用线程不被用作工作线程。

如何在 Java 中创建并行流?

在 Java 中创建并行流有两种方法:

  1. 使用流上的 parallel() 方法
  2. 使用集合上的 parallelStream() 方法

使用流上的 parallel() 方法

parallel() 方法定义在属于 java.util.stream 包的 BaseStream 接口中。它执行中间操作。它返回一个等效的并行流。如果流已经是并行的,或者流的状态已更改为并行,它也可以返回自身。

语法

让我们通过一个 Java 程序创建一个并行流。

在下面的程序中,我们创建了 File 类的构造函数,并将一个文件传递给它。之后,我们创建了一个 Stream,它一次读取指定的文本文件的一行。在下一条语句中,我们调用了 parallel() 方法,该方法将文件的文本打印到控制台。这里需要注意的一点是,每次运行时的执行顺序都不同。

注意:创建一个名为 demo.txt 的文件并向其中写入一些内容,以便获得正确的输出。

ParallelStreamExample1.java

输出

Rahul
Anupam
Shubham
Nikhil
Ashish
Yuvan

注意:我们在上述位置创建了名为 demo.txt 的文件。如果您想要相同的结果,请创建同名文件并(如输出所示)将数据写入该文件。

使用集合上的 parallelStream() 方法

parallelStream() 方法是 Collections 接口中的一个预定义方法,属于 java.util 包。它返回以集合为源的并行流。

在下面的 Java 程序中,我们做了同样的事情,但在这个程序中,我们使用了 List 来从文件中读取文本。我们使用了 paralleStream() 方法,而不是 parallel() 方法。

ParallelStreamExample2.java

输出

Silver
Golden
Black
Green
Blue
Orange
Gray
Red	

注意:我们在上述位置创建了名为 color.txt 的文件。如果您想要相同的结果,请创建同名文件并(如输出所示)将数据写入该文件。


下一个主题Java 中的 SHA 哈希