7

カスタム スプリッテレータから生成されたストリームを返すメソッドがあります。スプリッターはトレッドセーフではありません。スプリッテレータはトレッド セーフではなく、状態を維持するため、並列実行を防止したいと考えています。返されたストリームが並行して実行されないようにする方法はありますか?

これを行うドキュメントや例を見つけることができませんでした。sequential()クラスでメソッドを見つけましたBaseStreamが、ユーザーが呼び出しparallel()て並列ストリームを取得することを妨げているようには見えません。

4

2 に答える 2

5

並列ストリームはtrySplit()スプリッテレータのメソッドを呼び出して、タスクをいくつかの部分に分割します。「私は分割を拒否します」と言うことから戻ることは絶対に合法です. この場合、スプリッテレータから作成されたストリームは、明示的に呼び出された場合でも順次実行されます。nulltrySplit().parallel()

AbstractSpliteratorただし、一般的には、クラスを拡張する少なくとも限定的な並列処理を提供できます。trySplit()メソッドを呼び出すいくつかの入力要素を読み取り、それらを配列に格納し、その配列にスプリッテレータを返すデフォルトの実装を提供するtryAdvance()ため、この部分はスプリッテレータとは完全に独立して個別に処理できます。これは「貧弱な」並列化ですが、下流のパイプライン操作に時間がかかる場合は、それでも速度が向上する可能性があります。

最後に、ほとんどの単純なケースでは、Spliterator の実装はスレッド セーフではないことに注意してください。独自の効率的なtrySplit()実装を提供すると、元のスプリッテレータと新しく作成されたスプリッテレータが完全に独立した方法で処理されることが保証されます。したがって、分割後にプレフィックスとサフィックスのスプリッテレーターで共有状態を変更しない場合は、スレッドセーフを気にする必要はありません。

于 2015-11-21T03:04:42.607 に答える