Rx演算子の実行順序を把握しようとしています。Rx演算子の実行順序
私が知っているのは、最後のものが作成演算子です。観察者は加入者がそこにいる(冷たい観察可能な)まで作成されません。これは、両方のimmediate
とtrampoline
スケジューラ(上で実行することの両方を表示さ
[email protected]-
MAP Thread[main,5,main]
SUBSCRIBE Thread[main,5,main]
CREATE Thread[main,5,main]
[email protected]--
CREATE Thread[RxComputationScheduler-3,5,main]
MAP Thread[RxComputationScheduler-2,5,main]
SUBSCRIBE Thread[RxComputationScheduler-1,5,main]
[email protected]
MAP Thread[pool-1-thread-2,5,main]
CREATE Thread[pool-1-thread-3,5,main]
SUBSCRIBE Thread[pool-1-thread-1,5,main]
[email protected]----
CREATE Thread[RxIoScheduler-4,5,main]
MAP Thread[RxIoScheduler-3,5,main]
SUBSCRIBE Thread[RxIoScheduler-2,5,main]
[email protected]-
MAP Thread[RxNewThreadScheduler-2,5,main]
SUBSCRIBE Thread[RxNewThreadScheduler-1,5,main]
CREATE Thread[RxNewThreadScheduler-3,5,main]
[email protected]--
MAP Thread[main,5,main]
SUBSCRIBE Thread[main,5,main]
CREATE Thread[main,5,main]
(複数の実行についても同様)
public static void main(String[] args) throws InterruptedException {
test(Schedulers.immediate());
test(Schedulers.computation());
ExecutorService executor = Executors.newCachedThreadPool();
test(Schedulers.from(executor));
executor.shutdown();
test(Schedulers.io());
test(Schedulers.newThread());
test(Schedulers.trampoline());
}
static void test(Scheduler scheduler) throws InterruptedException {
System.out.printf("-------%s--------\n", scheduler);
Observable<Integer> create = Observable.create(c -> {
c.onNext(1);
c.onCompleted();
print("CREATE");
});
create
.subscribeOn(scheduler)
.observeOn(scheduler) .map(e -> { print("MAP"); return e * 2; })
.observeOn(scheduler) .subscribe(a -> { print("SUBSCRIBE");});
TimeUnit.MILLISECONDS.sleep(200);
}
static synchronized void print(String s) {
System.out.printf("%s %s\n", s, Thread.currentThread());
}
出力:
だから、私はこの動作をテストする場合は、このコードを書かメインスレッド)は、私が期待する正しい方法を実行します。
しかし、他のスケジューラは異なります(しかし、synchronizing
の方法print
、AFAIKは競合状態がstd output
になるのを防ぎます)。
なぜこのようなことが起こっていますか?
おかげ。私はちょうど、この順番で作成されたスレッド(subscribe、map、create) - スレッド番号に基づいています。しかし、それはメインスレッドの場合のようにマップを作成する必要がありますか? –
@MuhammadHewedyどのスレッドを作成するかは関係ありません。とにかく特定の注文の保証はありません。それはマルチ踏みの性質です。プログラムを実行するたびに同じ結果(すべてのスケジューラで同じ順序)が表示されますか? 5〜10回確認してください。 –