gpt4 book ai didi

java - 限制无限并行流

转载 作者:行者123 更新时间:2023-11-29 07:34:40 26 4
gpt4 key购买 nike

1) 我如何使用 Supplier ( supplier ) 并行创建 N 个值的大小流,同时确保对供应商的调用不超过 N 次?我需要这个,因为我有一个供应商提供昂贵的 supplier.get()操作。

2) 我的问题的“明显”答案,Streams.generate(supplier).limit(N) , 不起作用,并且通常会导致向供应商发出 N 次以上的调用。这是为什么?

作为 Streams.generate(supplier).limit(N) 事实的“证明”结果超过 N 次调用 supplier.get() ,请考虑以下代码:

public class MWE {
static final int N_ELEMENTS=100000;
static Supplier<IntSupplier> mySupplier = () -> new IntSupplier() {
AtomicInteger ai = new AtomicInteger(-1);
@Override
public int getAsInt() {
return ai.incrementAndGet();
}
};
public static void main(String[] args) {
int[] a = IntStream.generate(mySupplier.get()).limit(N_ELEMENTS).toArray();
int[] b = IntStream.generate(mySupplier.get()).parallel().limit(N_ELEMENTS).toArray();
}
}

a等于[0, 1, ..., N_ELEMENTS-1]正如预期的那样,但与您的预期相反b不包含与 a 相同的元素.相反,b通常包含大于或等于 N_ELEMENTS 的元素, 表示大于N_ELEMENTS调用供应商的次数。

另一个例子是 Streams.generate(new Random(0)::nextDouble()).limit(5)并不总是生成相同的一组数字。

最佳答案

流 API 不保证 IntStream.generate() 会调用生成器指定的次数。此调用也不遵守顺序。

如果您确实需要递增数字的并行流,最好使用 IntStream.range(0, N_ELEMENTS).parallel()。这不仅确保您实际上拥有从 0N_ELEMENTS-1 的所有数字,而且大大减少了争用并保证了顺序。如果您需要生成更复杂的东西,请考虑使用定义您自己的 Spliterator 类的自定义源。

请注意,建议的 IntStream.iterate 解决方案可能无法很好地并行化,因为它是按自然顺序排列的源。

关于java - 限制无限并行流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37470465/

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