[解決済み】RxJavaスケジューラの使用例
2022-04-03 13:18:40
質問
RxJavaでは 5種類のスケジューラ を選択することができます。
<ブロッククオート-
immediate() : 現在のスレッドで直ちに作業を実行する Scheduler を作成し、返します。
-
トランポリン() : 現在の作業が完了した後に実行されるように、現在のスレッドの作業をキューに入れる Scheduler を作成し、返します。
-
newThread() : 作業単位ごとに新しいThreadを作成するSchedulerを作成し、返します。
-
computation() : 計算を行うための Scheduler を生成して返す。イベントループ、コールバック処理、その他の計算処理に使用できる。このスケジューラでIOバウンド作業を行わないでください。スケジューラを使用する。 io() の代わりに
-
io() : IOバウンド作業を目的としたSchedulerを作成し、返します。 この実装は、必要に応じて拡張される Executor スレッドプールによって支えられています。これは、ブロック IO を非同期に実行するために使用することができます。このスケジューラで計算を行わないでください。Scheduler を使ってください。 コンピュテーション() の代わりに
質問
最初の3つのスケジューラについては、ほぼ説明がつくと思います。 計算 と イオ .
-
IOバウンド作業とは何ですか?ストリームを扱うときに使うのでしょうか(
java.io
) やファイル (java.nio.files
)? データベースの問い合わせに使うのか?ファイルのダウンロードやREST APIへのアクセスに使用されているか? - どのように computation() とは異なります。 newThread() ? それは、すべての computation() の呼び出しは、毎回新しい(バックグラウンド)スレッドではなく、単一の(バックグラウンド)スレッド上で行われるのですか?
- を呼び出すことがなぜ悪いのでしょうか? computation() IO作業をしているとき?
- を呼び出すのはなぜ良くないのでしょうか? io() 計算をするとき?
解き方は?
素晴らしい質問ですね。ドキュメントにもう少し詳しい説明があってもいいのではないでしょうか。
-
io()
は、無限のスレッドプールに支えられ、非計算集約的なタスク、つまりCPUにあまり負荷をかけないようなタスクに使われるようなものです。ファイルシステムとのやりとり、データベースや別のホストのサービスとのやりとりがその例です。 -
computation()
は、利用可能なプロセッサの数に等しいサイズの境界付きスレッドプールによって支えられています。もし CPU に負荷のかかる作業を利用可能なプロセッサの数以上に渡って並列にスケジュールしようとすると (例えばnewThread()
スレッドがプロセッサを奪い合うため、スレッド生成のオーバーヘッドとコンテキストスイッチのオーバーヘッドが発生し、大きなパフォーマンスヒットになる可能性があります。 -
を残しておくのがベストです。
computation()
を CPU 集中の作業のみに使用すると、CPU の使用率が悪くなります。 -
を呼び出すのはよくありません。
io()
で説明した理由により、計算機用として使用することができます。io()
は束縛されないので、もし1000の計算タスクをio()
を並列に実行すると、1000個のタスクがそれぞれスレッドを持ち、CPUを奪い合うことになり、コンテキストスイッチのコストが発生します。
関連
-
[解決済み] Javaで拡張子なしのファイル名を取得する方法は?
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] java.io.IOException。DER長の短い読み取り
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JVMフラグCMSClassUnloadingEnabledは、実際に何をするのですか?
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] JavaFX 同じパッケージ内なのに「場所が必要です。
-
[解決済み] java swingアプリケーションでJCEがプロバイダBCを認証できない
-
[解決済み] x--やx++はここで何をするのですか?