[RxJava]RxJavaスケジューラ

10800 ワード

📝RxJavaの学習手順
1.不可観測類を明確に理解する(特に熱不可観測と冷不可観測の概念を理解しなければならない)
2.変換、制御、結合演算子などのカテゴリの主な関数を学習する
3.スケジューラの意味、subscribeOn()とobserverOn()関数の違い
4.その他のデバッグ、フロー制御関数

1.RxJava Scheduler


RxJavaでは、スケジューラは、RxJavaの非同期プログラミングのためのスレッドマネージャです.
つまり、スケジューラを使用して、どのスレッドで何を処理するかを制御できます.
RxJavaのみを使用して非同期処理を行うのではなく、スケジューラを使用してのみ、非同期操作を実現できます.
スケジューラを使用して、通知者とデータ処理者のスレッドを分離することで、スレッドにコードを記述する簡潔さとスレッドの複雑さを低減できます.
プロバイダ側のデータストリームを制御してスケジューラを指定するには、subscribeOn()およびobserverOn()演算子を使用して、サブスクライバが渡すデータ処理を制御します.
subscribeOnは、最初の呼び出しにのみ影響しますが、どこにいても複数回呼び出され、後で実行される演算に影響を与えるため、位置が重要です.

Observable.fromIterable(shapes) // shapes 리스트는 (Red,Ball), (Green, Ball), (Blue,Ball) 이렇게 구성되어 있습니다.
        .subscribeOn(Schedulers.computation())
        .subscribeOn(Schedulers.io())
        .doOnSubscribe(data -> MyUtil.printData("doOnSubscribe")) // printData System.out.println(""+Thread.currentThread().getName()+" | "+message+" | ")
        .doOnNext(data -> MyUtil.printData("doOnNext", data))
        .observeOn(Schedulers.newThread())                  
        .map(data -> {data.shape = "Square"; return data;})
        .doOnNext(data -> MyUtil.printData("map(Square)", data))
        .observeOn(Schedulers.newThread())                  
        .map(data -> {data.shape = "Triangle"; return data;})
        .doOnNext(data -> MyUtil.printData("map(Triangle)", data))
        .observeOn(Schedulers.newThread())                  
        .subscribe(data -> MyUtil.printData("subscribe", data));
subscribeOnでは、複数回呼び出されても最初の呼び出しにのみ影響するため、計算スケジューラはデータストリームを生成し、observerOn(Schedulers.newthread()によってnew threadで演算を実行します.
main | doOnSubscribe | 
RxComputationThreadPool-1 | doOnNext | MyShape{color='Red', shape='Ball'}
RxComputationThreadPool-1 | doOnNext | MyShape{color='Green', shape='Ball'}
RxComputationThreadPool-1 | doOnNext | MyShape{color='Blue', shape='Ball'}
RxNewThreadScheduler-1 | map(Square) | MyShape{color='Red', shape='Square'}
RxNewThreadScheduler-1 | map(Square) | MyShape{color='Green', shape='Square'}
RxNewThreadScheduler-1 | map(Square) | MyShape{color='Blue', shape='Square'}
RxNewThreadScheduler-2 | map(Triangle) | MyShape{color='Red', shape='Triangle'}
RxNewThreadScheduler-2 | map(Triangle) | MyShape{color='Green', shape='Triangle'}
RxNewThreadScheduler-2 | map(Triangle) | MyShape{color='Blue', shape='Triangle'}
RxNewThreadScheduler-3 | subscribe | MyShape{color='Red', shape='Triangle'}
RxNewThreadScheduler-3 | subscribe | MyShape{color='Green', shape='Triangle'}
RxNewThreadScheduler-3 | subscribe | MyShape{color='Blue', shape='Triangle'}

2.スケジューラタイプ


スケジューラのタイプにはsingle、computing、io、trampoline、new threadがあります.
RxJavaは、計算、IO、および転送の3つの計画プログラムを使用することを推奨します.
public final class Schedulers {

    @NonNull
    static final Scheduler SINGLE;

    @NonNull
    static final Scheduler COMPUTATION;

    @NonNull
    static final Scheduler IO;

    @NonNull
    static final Scheduler TRAMPOLINE;
    
    @NonNull
    static final Scheduler NEW_THREAD;
}
Scheduler作成メソッドコンテンツSINGLEScheduler.()単一スレッドを作成し、COMPUTTIONスケジューラの使用を続行します.計算()内部にスレッドプールを作成します.スレッド数=プロセッサ数IOSchedulerです.io()必要に応じてネジの作成を続行します.トランポリン()現在のスレッドに無限サイズのキューNEW THREADSChedulerを作成します.新スレッドはnewThread()ごとに作成されます

1. Single Thread Scheduler


単一スレッドの繰り返し使用を続行します.RxJava内部でもスレッドが1つずつ作成され、1回に作成されたスレッドを使用して複数のタスクが処理されます.非同期処理を選択した場合、単一スレッドスケジューラを使用する必要はほとんどありません.

2. Computation Thread Scheduler


CPUに対応する計算スケジューラは、IO動作を行わない通常の計算/計算タスクに用いられる.

3. IO Thread Scheduler


ファイルI/OなどのIO操作やネットワーク要求の処理を行うスケジューラ.計算スケジューラとは異なり、必要に応じてスレッドの作成を続行します.

4. Trampoline Thread Scheduler


新しいスレッドを作成せずに、現在使用されているスレッドに無限サイズのキューを作成します.

5. New Thread Scheduler


他のスケジューラとは異なり、リクエストを受信するたびに新しいスレッドが生成されます.
ソース
https://4z7l.github.io/2020/12/14/rxjava-5.html