在Rx中设置调度程序的顺序

时间:2017-02-10 11:27:02

标签: rx-java kotlin reactive-programming

我对Rx真的很陌生,只是想知道subscribeOn的顺序如何影响Observable

//This will not print anything
Observable.just("whatever")
        .flatMap { s -> Observable.just(s.length) }
        .subscribeOn(Schedulers.newThread())
        .subscribe(::println)

//This prints the length
Observable.just("whatever")
        .subscribeOn(Schedulers.newThread())
        .flatMap { s -> Observable.just(s.length) }
        .subscribe(::println)

幕后发生了什么?为什么?

2 个答案:

答案 0 :(得分:2)

RxJava Scheduler使用守护程序线程,如果" main"可能会停止或不运行守护程序线程。 Java的线程退出。当我运行两个设置时,有时第二个也不会打印任何内容,有时它会打印;你是否看到了某些事情是概率性的。

这实际上取决于newThread对上游代码的反应和执行速度。对于第二种情况,因为它在主线程上发生了更长的订阅集,执行在subscribe之后返回的时间,newThread可能有足够的时间来触发打印。

如果你放Thread.sleep(1000),你会看到两个都打印出来。

答案 1 :(得分:2)

实际上他们都打印结果。唯一的区别是时机。这就是我认为对观察到的行为的解释 - 在第一种情况下,flatMap直接订阅了just线程上的mainprintln上的println的结果新线程。产生一个新线程并且main都是密集型操作需要花时间执行,flatMap线程在此之前退出。

在第二种情况下,just在新帖子上订阅printlnflatMapmain帖子上订阅main。因此,main线程由于生成新线程后的依赖性而被占用更多,我们在Observable.timer(3, TimeUnit.SECONDS).toBlocking().subscribe(); 退出之前看到结果。

您可以尝试使用最后一行中的以下代码执行相同的操作,以查看差异。

linux-vdso.so.1 =>  (0x00007ffcc5961000)
libOgreHlmsPbs.so.2.1.0 => ./libOgreHlmsPbs.so.2.1.0 (0x00007fedeec3f000)
libOgreHlmsUnlit.so.2.1.0 => ./libOgreHlmsUnlit.so.2.1.0 (0x00007fedeea1d000)
libOgreMain.so.2.1.0 => ./libOgreMain.so.2.1.0 (0x00007fedee194000)
/home/marvin/workspace/HLMS_DS_DEMO/libHLMS_DS.so => not found