java 8 流和并行流之间的区别
2022-09-01 02:33:57
我使用 Java 8 流和并行流编写代码,以使用自定义收集器执行聚合函数,以实现相同的功能。当我看到 CPU 使用率使用 时,它显示所有 CPU 内核都用于“流”和“并行流”版本。因此,似乎在使用时,它也使用所有CPU。在这里,在多核的使用方面和方面的确切区别是什么?htop
list.stream()
parallelStream()
stream()
我使用 Java 8 流和并行流编写代码,以使用自定义收集器执行聚合函数,以实现相同的功能。当我看到 CPU 使用率使用 时,它显示所有 CPU 内核都用于“流”和“并行流”版本。因此,似乎在使用时,它也使用所有CPU。在这里,在多核的使用方面和方面的确切区别是什么?htop
list.stream()
parallelStream()
stream()
请考虑以下程序:
import java.util.ArrayList;
import java.util.List;
public class Foo {
public static void main(String... args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
list.stream().forEach(System.out::println);
}
}
您会注意到,此程序将按它们在列表中的顺序按顺序从 0 到 999 输出数字。如果我们改变到这种情况,情况就不再好了(至少在我的计算机上):所有数字都是书面的,但顺序不同。因此,显然,确实使用了多个线程。stream()
parallelStream()
parallelStream()
这可以通过以下事实来解释:即使是单线程应用程序也被大多数现代操作系统划分为多个内核(同一线程的部分可以在多个内核上运行,但当然不是同时运行)。因此,如果您看到一个进程使用了多个内核,这并不意味着该程序使用多个线程。htop
此外,使用多个线程时,性能可能不会提高。同步的成本可能会降低使用多个线程的收益。对于简单的测试方案,情况通常如此。例如,在上面的示例中,是同步的。因此,实际上,尽管使用了多个线程,但只能同时写入数字。System.out
添加到@Hoopje的答案:
使用之前,请阅读以下内容:parallelStream ()
n