flatMap的行为与其中的不同调度程序

时间:2017-08-27 09:55:43

标签: rx-java2

当我在flatMap中更改返回的Observable的调度程序时,你能解释为什么我会得到奇怪的输出吗?例如,我有

Observable.range(1, 9)
        .flatMap {
            if (it < 5) {
                Observable.just(it)
                        .subscribeOn(Schedulers.io())
                        .observeOn(Schedulers.io())
            } else {
                Observable.just(it)
            }
        }
        .subscribe({ println("${it}: ${Thread.currentThread().name}") })
println("END")
Thread.sleep(200)

作为输出,我在每次运行时都有不同的结果。例如。 第一次发布

1: RxCachedThreadScheduler-3
2: RxCachedThreadScheduler-3
3: RxCachedThreadScheduler-3
5: main
6: main
7: main
END
4: RxCachedThreadScheduler-6
8: RxCachedThreadScheduler-6
9: RxCachedThreadScheduler-6

第二次发射输出:

5: main
1: main
2: main
3: main
6: main
7: main
8: main
9: main
END
4: RxCachedThreadScheduler-8

1 个答案:

答案 0 :(得分:3)

flatMap非确定地合并其中一个参与线程,因此即使内部源已定义subscribeOn和/或observeOn,也无法保证哪个线程会赢得从源头发出物品的特定时刻。因此,如果要确保在所需的线程上发生后续事件处理(直到有另一个异步边界运算符),则必须在observeOn之后应用flatMap