文档章节

RxJava threading<二十七>

woshixin
 woshixin
发布于 11/19 23:18
字数 908
阅读 6
收藏 0

因为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

© 著作权归作者所有

共有 人打赏支持
woshixin
粉丝 25
博文 288
码字总数 238978
作品 0
杭州
程序员
私信 提问
RxJava与RxAndroid的学习之路

RxJava 和 RxAndroid 四(RxBinding的使用) 对Rxjava不熟悉的同学可以先看我之前写的几篇文章 RxJava 和 RxAndroid 一 (基础) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroi...

guozhendan
06/26
0
0
RxJava 沉思录(一):你认为 RxJava 真的好用吗

本人两年前第一次接触 RxJava,和大多数初学者一样,看的第一篇 RxJava 入门文章是扔物线写的《给 Android 开发者的 RxJava 详解》,这篇文章流传之广,相信几乎所有学习 RxJava 的开发者都阅...

掘金官方
09/07
0
0
深入理解 RxJava2:前世今生(1)

前言 本系列文章适用于已经了解 RxJava 的读者,深入贯彻其原理,加深对其的认识。如果从未了解过 RxJava 的读者们,建议先熟悉它。 RxJava 0.x RxJava 最早是 Netflix 参照微软的 Rx.Net,在...

任我行
08/12
0
0
【Android学习】使用聚合数据的接口进行的RxAndroid学习

最近学习RxJava,一直在看大神的文章。 RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java V......

夜晚晚
2016/11/30
196
0
《RxJava 2.x 实战》

我最近写了一本书《RxJava 2.x 实战》。 该书由电子工业出版社出版,目前已经在淘宝、京东、当当、亚马逊等各大电商平台上进行销售或预售。 天猫电子工业出版社旗舰店 https://detail.tmall...

fengzhizi715
04/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
22
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
17
0
my.ini

1

architect刘源源
今天
15
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
15
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部