Rx java 何时在RxJava中使用blockingSubscribe

Rx java 何时在RxJava中使用blockingSubscribe,rx-java,rx-java2,Rx Java,Rx Java2,在什么情况下需要在RxJava中使用blockingSubscribe 考虑如下,它可以打印结果。 Observable.just(1, 2, 3, 4, 5) .subscribe(line -> System.out.println(line)); 如果更改为以下内容,则不会打印结果,但原因是什么 Observable.interval(500, TimeUnit.MILLISECONDS) .subscribe(line ->

在什么情况下需要在RxJava中使用blockingSubscribe

考虑如下,它可以打印结果。

Observable.just(1, 2, 3, 4, 5)
            .subscribe(line -> System.out.println(line));
如果更改为以下内容,则不会打印结果,但原因是什么

Observable.interval(500, TimeUnit.MILLISECONDS)
            .subscribe(line -> System.out.println(line));
如果改为使用blockingSubscribe,则可以再次显示结果

Observable.interval(500, TimeUnit.MILLISECONDS)
            .blockingSubscribe(line -> System.out.println(line));

我读到blockingSubscribe就是阻止主线程,但为什么要像在现实世界中那样阻止主线程,如果不想阻止主线程执行,但仍然想使用Observable.interval呢?

第一个示例运行在订阅线程的堆栈上。当您订阅订阅时,将从调用线程执行subscribeAcutal。然后,just操作员将把所有项目1、2、3、4、5同步连接到订阅服务器。在每个onNext上,将调用Subscribe并打印号码

Observable.just(1, 2, 3, 4, 5)
            .subscribe(line -> System.out.println(line));
第二个示例不会打印任何内容,因为涉及并发性,并且您的主方法失败。在引擎盖下,间隔操作员使用调度程序。订阅时,Interval操作符将向调度程序添加一个作业,该作业将在500毫秒内运行。调用线程调用subscribe actual,操作符将作业添加到调度程序并完成。堆栈上没有更多要弹出的堆栈帧。因此,subscribe方法调用完成,调用主线程能够继续。在您的情况下,没有更多的方法可调用,因此程序退出。程序将以比发射更快的速度退出,发射将在500毫秒内发生。这就是为什么在System.out上看不到任何输出的原因

Observable.interval(500, TimeUnit.MILLISECONDS)
            .subscribe(line -> System.out.println(line));
如果要在打印singla之前阻止主线程退出,可以添加一个

Thread.sleep(1_000)
主线程将在Threadsleep停止1000毫秒。当主线程被阻塞时,调度程序将在另一个线程上发出一个值,该值随后将调用订阅服务器的onNext。将调用println调用并打印值

Observable.just(1, 2, 3, 4, 5)
            .subscribe(line -> System.out.println(line));
您在这里试图实现的是同步。主线程与另一个线程连接。这就是阻止*-订阅开始发挥作用。如果要将一个线程与另一个线程连接,则必须阻止该线程,直到特定信号到达为止

如果不想阻止主线程执行,但仍然想使用Observable.interval,该怎么办

应用程序中的主执行线程不允许完成

如何做到这一点? 只需创建/启动一个非守护进程线程,例如Android、SWT、JavaFX^1


^1

第二个可能不打印任何内容,因为它是非阻塞的,并且您用来测试它的函数在500毫秒间隔结束之前退出,这将结束测试并退出java。在预订电话后,再睡一觉,你就会看到它打印出来。