您当前的位置: 首页 >  Java
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试:Rxjava线程切换原理

沙漠一只雕得儿得儿 发布时间:2021-12-13 12:36:11 ,浏览量:0

RxJava的整个流程分为三个步骤 
  1. 从上到下创建任务链,这里没有涉及线程调度。默认执行在当前线程,在这里也就是主线程。

  2. 自下向上逆向订阅,这个过程subscribeOn起作用,observeOn不起切换线程作用。

  3. 从上到下执行,类似map中的代码,这时候observeOn起切换线程作用。

也是为什么subscribeOn只有第一次起作用,observeOn每次都起作用。 

Q1:为什么 subscribeOn() 只有第一次切换有效

简单分析一下代码执行流程

  1. 从上到下,建立上下依赖关系,初始化线程
  2. .subscribe为调用起点,自下向上开始准备调用,这个过程subscribeOn起作用,observeOn不起切换线程作用。
  3. 从上到下执行,类似map中的代码,这时候observeOn起切换线程作用。

因为 RxJava 最终能影响 ObservableOnSubscribe 这个匿名实现接口的运行环境的只能是最后一次运行的 subscribeOn() ,又因为 RxJava 订阅的时候是从下往上订阅,所以从上往下第一个 subscribeOn() 就是最后运行的,这就造成了写多个 subscribeOn() 只有第一个subscribeOn()有用。 如下图:subscribeOn()产生的线程切换发生在代码执行的第二层,而它的回溯又将会执行在新的线程中。因此,在subscribeOn切换线程以后的流程,均将在新的线程中执行。

observeOn()产生的线程切换都发生在第三层执行层,而在切换线程前的业务代码由于已经执行了,故不受切换线程切换的影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ls5mMUr2-1588413213214)(https://note.youdao.com/src/09B1E92C38784C9E9FC41CCC8A5AB080)]

 Q2:每一次observeOn的使用,都会将后面的观察者(同上)和将要切换的线程内容封装起来。

每次observeOn都会切换后面内容的执行线程。

Q3:observeOn() 的线程切换原理

总结:

  1. 子线程切换主线程:给主线程所在的Handler发消息,然后就把逻辑切换过去了。

  2. 主线程切换子线程:把任务放到线程池中执行就能把执行逻辑切换到子线程

  3. 子线程切换子线程:把任务分别扔进两个线程就行了。

Q4:线程控制Scheduler

可以利用 subscribeOn() 结合 observeOn() 来实现线程控制,让事件的产生和消费发生在不同的线程。又知道map(),和flatMap()等可以做不同的变换,那么也可以通过多次地调用函数来实现多次线程的切换

Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.newThread())
    .map(mapOperator) // 新线程,由 observeOn() 指定
    .observeOn(Schedulers.io())
    .map(mapOperator2) // IO 线程,由 observeOn() 指定
    .observeOn(AndroidSchedulers.mainThread) 
    .subscribe(subscriber);  // Android 主线程,由 observeOn() 指定

相关文章:RxJava2如何实现链式调用和线程切换_欢迎交流-CSDN博客_rxjava2 切换线程

rxjava源码分析文章:

RxJava2 源码解析——流程 - 简书

RxJava2 源码解析(一) - 简书

RxJava2 源码解析(二) - 简书

RxJava2 源码解析——线程调度 Scheduler - 简书

RxJava2线程切换原理_Mr_Wrong1的博客-CSDN博客_rxjava 线程切换

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0362s