RxJava threading<二十七>

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。

除非另有说明,否则每次调用onNext / onError / onCompleted都会同步执行整个运算符链,包括最终subscriber的操作。我们可以看到比以下示例:

输出:

我们在这里看到,我们从3个不同的线程中调用了onNext。每次订阅者的操作都在第一个onNext调用来自的同一个线程上执行。无论我们将多少个链接在一起,情况也是如此。除非我们另有请求,否则该值将同步。

subscribeOn 和 observeOn

subscribeOn和observeOn允许您控制订阅的调用和通知的接收(什么线程将在您的观察者上调用onNext / onError / onCompleted)。

在Rx中,您不直接处理线程。而是将它们包装在名为Scheduler的策略中。我们稍后会看到更多。

subscribeOn

使用subscribeOn,您可以决定执行Observable.create的Scheduler。即使你不是自己调用create,也有内在的等价。请考虑以下示例

输出:

我们在这里看到,不仅一切都在同一个线程上执行,它实际上是顺序的:在完成订阅)observable(包括执行create的lambda参数的主体)之前,subscribe不会解除阻塞。在lambda中对onNext的调用会执行整个运算符链,一直到println。实际上,订阅已创建的observable是阻塞的。

无论您要求什么,一些可观察者都会创建自己的线程。例如,Observable.interval是异步的。在这种情况下,subscribeOn将指定运行创建资源的函数的线程,这通常是没有用的。它使您无法控制将租用的资源。

输出:

observeOn

observeOn控制管道的另一侧。值的创建和发送将正常工作,但是您的观察器的操作将在调度程序策略指定的不同线程上调用。

输出:

与subscribeOn不同,observeOn的效果不会跳转到管道的开头。它只是改变了它之后的运算符的线程。您可以将其视为拦截事件并更改链的其余部分的线程。这是一个例子:

输出;

我们可以在这里看到事件从调用onNext的线程开始并保持在该线程上,直到它们遇到observeOn运算符。之后,他们继续新线程。这样,您可以将不同的线程策略分配给Rx管道的不同部分。

unsubscribeOn

正如我们所看到的,一些可观察对象依赖于订阅租用的资源,并在订阅结束时释放。通常,释放资源很便宜。在特殊情况下,您需要取消订阅操作以不阻止或特定地发生在特殊线程上,您可以指定将使用unsubscribeOn执行这些操作的调度程序。

输出:

using方法执行3个函数,一个租用资源,一个使用它,另一个释放它。使用unsubscribeOn,我们只影响了释放资源的功能。

下节再续!

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/1.%20Scheduling%20and%20threading.md

猜你喜欢

转载自my.oschina.net/u/2277632/blog/2878438
今日推荐