1)如何使用供應商(supplier
)並行創建N個大小的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)
並不總是生成相同的一組數字。
b含有大於或等於N_元件?你有多少個核心? –
你有沒有試過把'.parallel()'調用放在'limit'而不是之前? –
我認爲@LouisWasserman(理論上)並不重要。 – Tunaki