のconcatMapEager
を使用して、この動作を実現並行性
代わりに、私は私がflatMap
内部subscribeOn(Schedulers.io())
オペレータコールとチェーンだろうMain::retrieve
リターン(多分Observable.fromCallable
を使用して)Observable
に電話をかけるでしょう。
Schedulers.io()
では、長時間実行されるがCPUライトタスク(通常はIO)のスレッドプールが増えているRxJavaスケジューラが使用されます。
flatMap
の代わりに、** AND *並列化の両方が重要な場合はconcatMapEager
を使用できます。 concatMap
は、最初の内部Observableが完了するのを待って、2番目などのトリガーを待つことによって順序を維持します。 concatMapEager
は、すべての内部Observablesをトリガーし、順番に再生しますそれは可能です。
これは最小限のアプローチです。[ABC]をトリガーして[ACB]で受信すると、すぐに「A」が放出され(正しい順序)、Bが到着するまでCがバッファリングされ、バッファリングされ、同様に放射される。
ので、コードは次のようになります。
Observable<String> strings = Observable.from(Arrays.asList(5, 4, 7, 2, 1))
//be efficient/parallel friendly but still retain order
.concatMapEager(i ->
//Main's method has been converted to return an Observable
retrieve(i)
//retrieve will be executed in its own IO thread, so in parallel
.subscribeOn(Schedulers.io())
);