gpt4 book ai didi

java-8 - 与从迭代器创建的流的并行性

转载 作者:行者123 更新时间:2023-12-04 22:03:07 25 4
gpt4 key购买 nike

使用流进行实验时,我遇到了以下我不太了解的行为。我从迭代器创建了并行流,我注意到它似乎没有表现出并行性。在下面的示例中,我在控制台上打印了两个并行流的计数器,一个是从迭代器创建的,另一个是从列表创建的。从列表创建的流表现出我期望的行为,该行为将以非连续的顺序打印计数器,但是从迭代器创建的流以连续的顺序打印计数器。我是否错误地从迭代器创建了并行流?

    private static int counter = 0;

public static void main(String[] args) {
List<Integer> lstr = IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList());
Iterator<Integer> iter = lstr.iterator();

System.out.println("Iterator Stream: ");
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iter, Spliterator.IMMUTABLE | Spliterator.CONCURRENT), true).forEach(i -> {
System.out.print(counter + " ");
counter++;
});

counter = 0;
System.out.println("\nList Stream: ");
lstr.parallelStream().forEach(i -> {
System.out.print(counter + " ");
counter++;
});

}

最佳答案

没有保证并行处理以非顺序的顺序打印计数器。此外,由于您是在不同步的情况下更新变量,因此有可能会错过其他线程所做的更新,因此结果可能会完全不一致。

除此之外,必须顺序轮询Iterator,以便至少要从并行处理中获得一些 yield ,必须对元素进行缓冲,但是在没有已知大小的情况下,无法很好地估计要缓冲多少个元素。默认策略使用了上千个元素,并且无法很好地拆分工作。

因此,如果使用上千个元素,您可能会注意到更多的并行 Activity 。或者,您可以使用StreamSupport.stream(Spliterators.spliterator(iter, lstr.size(), 0), true)指定大小以构造流。然后,将调整内部使用的缓冲。

不过,List的流将具有更有效的并行处理,因为它不仅知道其大小,而且还支持利用基础数据结构的随机访问性质来划分工作量。

关于java-8 - 与从迭代器创建的流的并行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307102/

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