1. ホーム

[解決済み】RxJavaスケジューラの使用例

2022-04-03 13:18:40

質問

RxJavaでは 5種類のスケジューラ を選択することができます。

<ブロッククオート
  1. immediate() : 現在のスレッドで直ちに作業を実行する Scheduler を作成し、返します。

  2. トランポリン() : 現在の作業が完了した後に実行されるように、現在のスレッドの作業をキューに入れる Scheduler を作成し、返します。

  3. newThread() : 作業単位ごとに新しいThreadを作成するSchedulerを作成し、返します。

  4. computation() : 計算を行うための Scheduler を生成して返す。イベントループ、コールバック処理、その他の計算処理に使用できる。このスケジューラでIOバウンド作業を行わないでください。スケジューラを使用する。 io() の代わりに

  5. io() : IOバウンド作業を目的としたSchedulerを作成し、返します。 この実装は、必要に応じて拡張される Executor スレッドプールによって支えられています。これは、ブロック IO を非同期に実行するために使用することができます。このスケジューラで計算を行わないでください。Scheduler を使ってください。 コンピュテーション() の代わりに

質問

最初の3つのスケジューラについては、ほぼ説明がつくと思います。 計算 イオ .

  1. IOバウンド作業とは何ですか?ストリームを扱うときに使うのでしょうか( java.io ) やファイル ( java.nio.files )? データベースの問い合わせに使うのか?ファイルのダウンロードやREST APIへのアクセスに使用されているか?
  2. どのように computation() とは異なります。 newThread() ? それは、すべての computation() の呼び出しは、毎回新しい(バックグラウンド)スレッドではなく、単一の(バックグラウンド)スレッド上で行われるのですか?
  3. を呼び出すことがなぜ悪いのでしょうか? computation() IO作業をしているとき?
  4. を呼び出すのはなぜ良くないのでしょうか? io() 計算をするとき?

解き方は?

素晴らしい質問ですね。ドキュメントにもう少し詳しい説明があってもいいのではないでしょうか。

  1. io() は、無限のスレッドプールに支えられ、非計算集約的なタスク、つまりCPUにあまり負荷をかけないようなタスクに使われるようなものです。ファイルシステムとのやりとり、データベースや別のホストのサービスとのやりとりがその例です。
  2. computation() は、利用可能なプロセッサの数に等しいサイズの境界付きスレッドプールによって支えられています。もし CPU に負荷のかかる作業を利用可能なプロセッサの数以上に渡って並列にスケジュールしようとすると (例えば newThread() スレッドがプロセッサを奪い合うため、スレッド生成のオーバーヘッドとコンテキストスイッチのオーバーヘッドが発生し、大きなパフォーマンスヒットになる可能性があります。
  3. を残しておくのがベストです。 computation() を CPU 集中の作業のみに使用すると、CPU の使用率が悪くなります。
  4. を呼び出すのはよくありません。 io() で説明した理由により、計算機用として使用することができます。 io() は束縛されないので、もし1000の計算タスクを io() を並列に実行すると、1000個のタスクがそれぞれスレッドを持ち、CPUを奪い合うことになり、コンテキストスイッチのコストが発生します。