在什么情况下需要在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 怎么办?
第一个示例在订阅线程的堆栈上运行。当您订阅时,订阅将在调用线程中发生。然后,just运算符将在Next所有项目(1,2,3,4,5(同步到订阅者。在每个 onNext 上,将调用订阅并打印号码。
Observable.just(1, 2, 3, 4, 5)
.subscribe(line -> System.out.println(line));
第二个示例不会打印任何内容,因为涉及并发性并且您的主要方法"失败"。在引擎盖下,间隔运算符使用调度程序。在订阅时,间隔操作员将向计划程序添加一个作业,该作业将在 500 毫秒内运行。调用线程调用订阅实际,操作员将作业添加到调度程序并完成。堆栈上没有更多的堆栈帧要弹出。因此,订阅方法调用已完成,调用(主(线程能够继续。在您的情况下,没有更多的方法可以调用,因此程序退出。程序的退出速度将快于发出速度,这将在 500 毫秒内发生。这就是为什么您在System.out上看不到任何输出的原因。
Observable.interval(500, TimeUnit.MILLISECONDS)
.subscribe(line -> System.out.println(line));
如果你想在打印 singla 之前阻止你的主线程退出,你可以添加一个
Thread.sleep(1_000)
主线程将在线程#睡眠处停止 1000 毫秒。当主线程被阻塞时,调度程序将在另一个线程上发出一个值,然后该线程将调用订阅者的 onNext。将调用 println 调用并打印值。
您在这里要实现的是同步。 主线程与另一个线程。这是阻止*-订阅发挥作用。如果要将一个线程与另一个线程连接,则必须阻止线程,直到特定信号到达。
如果不想阻止主线程执行但仍想使用 Observable.interval 怎么办
不允许应用程序中的主执行线程完成。
如何实现这一点?
只需创建/启动一个非守护进程线程(例如Android,SWT,JavaFX(^1
^1 主方法不会返回