RxJavaスレッドプール

2218 ワード

Schedulerの使用
RxJavaでのマルチスレッド操作は,主に強力なScheduler集合によって提供される.RxJavaでは、スレッドに直接アクセスしたり操作したりすることはできません.スレッドを使用する場合は、内蔵のSchedulerで実現する必要があります.
Schedulerをスレッドまたはスレッドプール(スレッドの集合)と見なし、異なるタイプの作業を実行できます.
簡単に言えば、特定のスレッドでタスクを実行する必要がある場合は、適切なSchedulerを選択する必要があります.Schedulerは次に、プールから使用可能なスレッドを取得し、スレッドに基づいてタスクを実行します.
RxJavaフレームワークには様々なタイプのSchedulerがありますが、ここでは適切な仕事のために適切なSchedulerを選択するテクニックがあります.適切なSchedulerを選択しないと、タスクが最適に実行されないので、次に、各Schedulerを理解してみましょう.
Schedulers.io()
これは、ファイルシステムへのアクセス、ネットワーク呼び出しの実行、データベースへのアクセスなど、CPUが密集していないI/O作業に適した境界なしスレッドプールをサポートするSchedulerです.このSchedulerは制限されず、スレッドプールは必要に応じて成長することができます.
Schedulers.computation()
このSchedulerは、大規模なデータセットの処理、画像処理など、CPUが密集している作業を実行するために使用される.境界のあるスレッドプールがサポートされており、スレッドの最大数は使用可能なプロセッサ数です.
このSchedulerはCPUが密集しているタスクにのみ適しているため,スレッドの数を制限することを望んでいるが,そうすると,CPU時間を奪い合ったり,スレッドが餓死したりすることはない.
Schedulers.newThread()
このSchedulerは毎回新しいスレッドを作成して作業を完了します.スレッドプールから利益を得ることはありません.スレッドの作成と破棄は高価なので、サーバシステムが遅くなったり、メモリオーバーフローのエラーが発生したりしないように注意する必要があります.
理想的には、このSchedulerはあまり使用されません.完全に分離されたスレッドで長時間の実行、分離のタスクのセットを開始するために使用されることが多いです.
Schedulers.single()
このSchedulerはRxJava 2が新たに導入したもので,その背後にはサポートとして1つのスレッドしかなく,秩序ある方法でしかタスクを実行できない.Appの異なる場所でバックグラウンドタスクのセットを実行する必要がありますが、同時に1つのタスクの実行にしか耐えられない場合は、このSchedulerが役に立ちます.
Schedulers.from(Executor executor)
独自のExecutorをサポートするカスタムSchedulerを作成できます.一部のシーンでは、カスタムのSchedulerを作成してAppのために特定のタスクを実行したい場合があります.これらのタスクには、カスタムスレッドロジックが必要になる場合があります.
仮に、Appにおけるパラレルネットワーク要求の数を制限したい場合、カスタムSchedulerを作成し、固定スレッドプールサイズのExecutor:Scheduler.from(Executors.newFixedThreadPool(n))を作成し、コード内のすべてのネットワークに関連するObservableに適用することができます.
AndroidSchedulers.mainThread()
コアRxJavaライブラリでは使用できない特殊なSchedulerです.使用するには、RxAndroid拡張ライブラリを使用する必要があります.このSchedulerは、アプリケーションのメインスレッドでUIベースのタスクを実行できるAndroid Appに特に役立ちます.
デフォルトでは、メインスレッドに関連付けられたlooperを適用してタスクキューを作成しますが、他のバリエーションがあり、任意のLooper:AndroidSchedulers.from(Looper looper)をAPIとして使用できます.
注意:Schedulers.io()などの境界なしスレッドプールでサポートされているSchedulerを使用する場合は、スレッドプールが無限に増加し、システムに大量のスレッドが発生する可能性があるため、特に注意してください.
その他
以上の観点から抜粋すると、AndoidでRxJava 2をどのように使用してマルチスレッドプログラミングを行いますか?とても上手で、原文を読むことを強くお勧めします.