前提:
そこにRxJavaにある5つの異なるスケジューラ利用できます。
- ()即時ロード:作成し、すぐに現在のスレッドに作業を行うためにスケジューラを返します。
- トランポリンは() :作成し、スレッドはすぐに動作しますが、私たちの待機時間の終了後に実行するように設定できるようになるまで(デフォルトは0)、もちろん、これは設定を遅らせることで待機しないスケジューラ、スケジューラを返します。 Runnableをで内部設定を実現。もう一つのポイントは、すべてのタスクがキューに追加することで、次に実行するためにオンにします。
- newthreadは() :各タスクのための新しいスレッドを作成し、作成し、スケジューラを返します。
- 計算は() :作成し、スケジューラが作業を計算するのに使用されて戻ります。コールバックや他の計算を処理し、イベントループで使用することができます。私たちが使用できる、作業を実行するためにIOスケジューラのこのタイプを使用しないように注意してください)(IOを代わりに。
- IOは() :仕事の種類のためのIOスケジューラを作成し、返します。この実装は、必要に応じて、スレッドプールが成長することができますスレッドプールエグゼキュータを維持しています。スケジューラは、非同期IOをブロックを実行するために使用することができます。コンピューティングタスクを実行するためにスケジューラを使用しないでください。
問題:
最初の3つのスケジューラは、非常に場所を説明し、計算()とIO()少し混乱を。
- 「IOバウンドの仕事は、」正確には何ですか?これは、(処理の流れに適している
java.io
)とファイル(java.nio.files
)は何?データベースクエリ、それに適しましたか?ファイルをダウンロードしたり、REST APIにアクセスするために適用しますか? - 計算()と newThread() 2つの違いは何ですか?
- なぜIOタスク中のコールの計算は、()悪いでしょうか?
- コンピューティングタスクを実行するときに、なぜ呼び出しIO()悪いでしょうか?
回答:
偉大な質問は、私は、ドキュメントがより多くの詳細を提供することができると思います。
io()
非計算集約型のタスクを実装するためのスレッドプールのサポートから、スレッドの数は無制限では、これらのタスクは、マザーボード上のサウスブリッジチップは、フロッピードライブを担当するハードディスク、キーボードと追加され、そのような北とサウスブリッジチップとして(CPUにあまり負担が発生することはありませんカードのデータ交換)。そのため、異なるホスト上のファイルシステム、データベースや双方向サービスとの相互作用は、よく適しシーンがあります。computation()
利用可能なプロセッサの数に等しい支持スレッドプールのサイズの限られた数の。あなたが(例えば、プロセッサの外部に利用可能な使用として集中並列CPUをスケジュールしようとした場合newThread()
)は、スレッドの競合プロセッサは、あなたがオーバーヘッドスイッチングスレッド生成及びコンテキストのオーバーヘッドに直面するとき、それは大幅に性能が影響を受けることができます。- 唯一の最高残し
computation()
CPU集約型の仕事を、そうでなければ、良いCPU使用率を取得することができなくなります。 io()
よると、2コンピューティングタスクを実行するとき話し言葉使用中のio()
あなたがあれば非常に良いですがio()
、その後千コンピューティングタスク、この千の任務を手配平行それぞれが独自のスレッドを持っており、CPU、生成コンテキストのために競いますコストを切り替えます。