java 8 流和并行流之间的区别

2022-09-01 02:33:57

我使用 Java 8 流和并行流编写代码,以使用自定义收集器执行聚合函数,以实现相同的功能。当我看到 CPU 使用率使用 时,它显示所有 CPU 内核都用于“流”和“并行流”版本。因此,似乎在使用时,它也使用所有CPU。在这里,在多核的使用方面和方面的确切区别是什么?htoplist.stream()parallelStream()stream()


答案 1

请考虑以下程序:

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


答案 2

添加到@Hoopje的答案:

使用之前,请阅读以下内容:parallelStream ()

  1. 它是多线程的。在java中,仅仅编写parallelStream()来获得并行性几乎总是一个坏主意。在某些情况下,它可以工作,但并非总是如此。还有其他方法可以实现并行性,并且几乎总是,在采用多线程解决方案之前,您需要考虑很多。
  2. 它使用缺省的 JVM 线程池。因此,如果您正在执行任何阻止操作(例如网络调用),则整个Java应用程序可能会卡住。这是最大的问题。还有其他具有任务分配功能的。具有线程的简单执行服务可提供比并行流更好的性能。n

你也可以阅读:Java并行流对你的健康有害!|JRebel by Perforce