Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java RxJava异步观察程序未命中元素_Rx Java - Fatal编程技术网

Rx java RxJava异步观察程序未命中元素

Rx java RxJava异步观察程序未命中元素,rx-java,Rx Java,我使用observeOn来观察另一个线程中的可观察对象: Observable.just("Hello", "world!").observeOn(Schedulers.io()).subscribe(System.out::println); 但是,此代码并不总是输出“Hello world!”。同样的情况也发生在出版主题上: PublishSubject<String> subject = PublishSubject.create(); subject.observeOn(S

我使用observeOn来观察另一个线程中的可观察对象:

Observable.just("Hello", "world!").observeOn(Schedulers.io()).subscribe(System.out::println);
但是,此代码并不总是输出“Hello world!”。同样的情况也发生在出版主题上:

PublishSubject<String> subject = PublishSubject.create();
subject.observeOn(Schedulers.io()).subscribe(System.out::println);
subject.onNext("Hello");
subject.onNext("world!");
PublishSubject=PublishSubject.create();
subject.observeOn(Schedulers.io()).subscribe(System.out::println);
subject.onNext(“你好”);
subject.onNext(“世界!”);

为什么这段代码不总是打印“Hello world!”?我认为至少在第二个示例中,subscribe会同时收到这两条消息,因为它在onNext调用之前订阅。是否有办法同时接收这两条消息?

IO调度程序需要一些时间准备就绪


使用onNext发射项目时,它尚未准备就绪,因此您错过了它

RxJava调度器底层的线程都是守护进程线程,如果所有其他非守护进程线程都已完成,JVM将停止这些线程。如果从
static void main()
运行示例,则
main()
方法很可能会在其他线程有机会运行之前终止,因此不会执行打印代码


根据您想要观察序列的方式,您可以在可观察链上使用
toBlocking()
,或者在
onCompleted()
方法实现中使用
CountDownLatch
countDown()

您真的想在这里使用Schedulers.io()吗?根据文档,它应该只用于IO操作,如文件读取或网络。从根本问题的角度来看,IO()的使用是无关的。它用于阻塞操作,通常是IO,但没有任何东西可以阻止您对其进行计算。这个答案有点误导:如果给予足够的时间,他们将处理onNext而不会丢失数据,但是示例程序在处理之前退出。谢谢,这确实是个问题!我使用CountDownLatch来防止该问题。然而,我不确定我是否理解toblock的语义。这会使调用线程阻塞直到调用onCompleted吗?BlockingObservable上的方法在当前线程上执行,本质上是阻塞的。一些穷举方法会一直阻塞,直到上游终止为onComplete或onError。