我对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)
幕后发生了什么?为什么?
答案 0 :(得分:2)
RxJava Scheduler使用守护程序线程,如果" main"可能会停止或不运行守护程序线程。 Java的线程退出。当我运行两个设置时,有时第二个也不会打印任何内容,有时它会打印;你是否看到了某些事情是概率性的。
这实际上取决于newThread
对上游代码的反应和执行速度。对于第二种情况,因为它在主线程上发生了更长的订阅集,执行在subscribe
之后返回的时间,newThread
可能有足够的时间来触发打印。
如果你放Thread.sleep(1000)
,你会看到两个都打印出来。
答案 1 :(得分:2)
实际上他们都打印结果。唯一的区别是时机。这就是我认为对观察到的行为的解释 - 在第一种情况下,flatMap
直接订阅了just
线程上的main
和println
上的println
的结果新线程。产生一个新线程并且main
都是密集型操作需要花时间执行,flatMap
线程在此之前退出。
在第二种情况下,just
在新帖子上订阅println
,flatMap
在main
帖子上订阅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