Amarnathハリッシュ:
例えばConcurrentHashMapのよう - この還元に使用される結果のコンテナを同時に変更コレクションであったこと、しかし、と仮定する。その場合に、アキュムレータの並列呼び出しは、実際には異なる結果コンテナをマージするコンバイナの必要性を排除し、同じ共有結果容器に同時にその結果を堆積させることができました。これは、潜在的に並列実行性能の向上を提供します。私たちは、同時削減これを呼び出します。
さらに
Aコレクタサポートの同時低減がCollector.Characteristics.CONCURRENT特性でマークされていること。しかし、同時コレクションにも欠点があります。複数のスレッドが共有容器に同時に結果を堆積している場合、結果が堆積される順序は非決定的です。
以下からのドキュメント
この手段は、サプライヤーとの収集方法は、(同時スレッドセーフ)が必要ですCollector.Characteristics.CONCURRENTを。したがって、どのような順序を維持するべきではありません。
しかし、私のコード
List<Employee> li=Arrays.asList(Employee.emparr());
System.out.println("printing concurrent result "+li.stream().parallel().unordered().map(s->s.getName()).collect(() -> new ConcurrentLinkedQueue<>(),
(c, e) -> c.add(e.toString()),
(c1, c2) -> c1.addAll(c2))
.toString());
常に遭遇した順序で結果を出力します。これは私の意味はCollector.CharacteristicsをCONCURRENTではありませんか?どのようにチェックして、この特性を設定するには?
ユージン:
あなたは、Collector
あなたがが提供する同時コレクションを使用することを知らないSupplier
だけで特性を追加し、それはあなたが望むように実行されたことがわかり、。例えば:
String s = Stream.of(1, 2, 3, 4).parallel()
.unordered()
.collect(
Collector.of(
() -> new ConcurrentLinkedQueue<>(),
(c, e) -> c.add(e.toString()),
(c1, c2) -> {
c1.addAll(c2);
return c1;
},
Characteristics.CONCURRENT))