1)サプライヤ(supplier
)を使用してN個の値のサイズ付きストリームを並行して作成し、サプライヤにN回以上のコールを行わないようにするにはどうすればよいですか?これは、私が高価なsupplier.get()
操作のサプライヤを持っているために必要です。無限並列ストリームの制限
2)私の質問Streams.generate(supplier).limit(N)
の「明白な」答えはうまくいかず、しばしばサプライヤーにN回以上の呼び出しが行われます。どうしてこれなの?
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
を期待するかもしれないものに反している:Nは、次のコードを検討し、supplier.get()
への呼び出しよりも多くの中Streams.generate(supplier).limit(N)
結果があるという事実の「証拠」として
a
と同じ要素は含まれていません。代わりに、b
には、N_ELEMENTS
以上の要素が含まれている場合があり、これはN_ELEMENTS
件以上のサプライヤへの呼び出し回数を示します。
Streams.generate(new Random(0)::nextDouble()).limit(5)
が必ずしも同じ番号のセットを生成するとは限りません。
bより大きいか等しいN_ELEMENTS?いくつのコアがありますか? –
以前はなく 'limit'の後に' .parallel() '呼び出しを入れてみましたか? –
私はそれが@LouisWasserman(理論上)に関係するとは思わない。 – Tunaki