Java并行流Parallel Streams
是Java8和更高版本的一个特性,用于利用处理器的多个核心。通常,任何java代码都有一个处理流,在这里它是按顺序执行的。然而,通过使用并行流,我们可以将代码分成多个流,这些流在不同的内核上并行执行,最终的结果是各个结果的组合。然而,处理的顺序不在我们的控制之下。
因此,建议在以下情况下使用并行流:无论执行顺序如何,结果不受影响,一个元素的状态不影响另一个元素,并且数据源也不受影响。
有两种方法可以在Java中创建并行流:
1. 对Stream流使用Parallel()方法
BaseStream
接口的parallel()
方法返回等效的并行流。让我们通过一个例子来解释它是如何工作的。
在下面给出的代码中,我们创建了一个file
对象,它指向系统中预先存在的txt文件。然后我们创建一个从文本文件一次读取一行的流。然后我们使用parallel()
方法在控制台上打印读取的文件。每次运行的执行顺序不同,您可以在输出中观察到这一点。下面给出的两个输出具有不同的执行顺序。
// An example to understand the parallel() method
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;
public class ParallelStreamTest {
public static void main(String[] args) throws IOException {
// Create a File object
File fileName = new File("M:\\Documents\\Textfile.txt");
// Create a Stream of String type
// Using the lines() method to read one line at a time
// from the text file
Stream<String> text = Files.lines(fileName.toPath());
// Use StreamObject.parallel() to create parallel streams
// Use forEach() to print the lines on the console
text.parallel().forEach(System.out::println);
// Close the Stream
text.close();
}
}
输出1:
输出2:
2. 对集合使用ParallelStream()
Collection
接口的parallelStream()
方法返回一个可能的以集合为源的并行流。让我们用一个例子来解释工作原理。
在下面给出的代码中,我们再次使用并行流,但这里我们使用一个列表来读取文本文件。因此,我们需要parallelStream()
方法。
// An example of parallelStream() method
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.*;
public class ParallelStreamsTest3 {
public static void main(String[] args) throws IOException {
// Create a File object
File fileName = new File("M:\\Documents\\List_Textfile.txt");
// Create a List
// Using readAllLines() read the lines of the text file
List<String> text = Files.readAllLines(fileName.toPath());
// Using parallelStream() to create parallel streams
text.parallelStream().forEach(System.out::println);
}
}
输出:
为什么使用并行流?
并行流的引入是为了提高程序的性能,但是选择并行流并不总是最好的选择。在某些情况下,我们需要以特定的顺序执行代码,在这些情况下,我们最好使用顺序流以牺牲性能为代价来执行任务。这两种流之间的性能差异仅在大型程序或复杂项目中才值得关注。对于小规模的项目,它甚至可能不明显。基本上,当顺序流表现不佳时,您应该考虑使用并行流。