gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:03:19 26 4
gpt4 key购买 nike

我使用 Java 8 流和并行流编写代码,以实现相同的功能,并使用自定义收集器执行聚合功能。当我使用 htop 查看 CPU 使用率时,它会显示所有 CPU 内核都用于“流”和“并行流”版本。因此,似乎在使用 list.stream() 时,它也使用了所有 CPU。这里,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 的解释是,即使是单线程应用程序也被大多数现代操作系统划分为多个内核(同一线程的一部分可能在多个内核上运行,但当然不是在同时)。所以如果你看到一个进程使用了​​多个内核,这并不一定意味着程序使用了多个线程。

此外,使用多个线程时性能可能不会提高。同步的成本可能会抵消使用多个线程的 yield 。对于简单的测试场景,通常是这种情况。例如,在上面的示例中,System.out 是同步的。因此,尽管使用了多个线程,但实际上只能同时写入数字。

关于java - java 8流和并行流之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31769187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com