首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rxjava 线程切换原理

前言 rxjava 可以很方便的进行线程切换, 那么rxjava是如何进行线程切换的呢?阅读本文可以了解下rxjava 是如何进行线程切换的及线程切换的影响点。...WanRxjava ", "onComplete td ==" + Thread.currentThread().getName()); } }); 如上代码,实现了线程切换和观察者被观察者绑定的逻辑...调用Observer.OnSubscribe 方法是 不受线程调度影响的 b.subscribeOn 影响的是发送事件的线程 c.observerOn 影响的是观察者处理接受数据的线程,如果没有调用observeOn...则不会进行包装成 ObserveOnObserver,也就是说不会执行观察者的线程切换,和 发送者的线程一致 d.多次调用subscribeOn切换线程,每次都会new ObservableSubscribeOn...,触发事件发送时会往上调用,也就是第一次调用的subscribeOn传入的线程 会执行发送事件,后面的线程切换无效 e.Observer.OnSubscribe 只会执行一次,因为调用DisposableHelper.setOnce

1.2K00

RxJava 线程模型分析

RxJava的被观察者在使用操作符时可以利用线程调度器--Scheduler来切换线程,例如 Observable.just("aaa","bbb") ....在RxJava2中表示立即执行,如果当前线程有任务在执行,则会将其暂停,等插入进来的新任务执行完之后,再将原先未完成的任务接着执行。...在RxJava1中表示在当前线程中等待其他任务完成之后,再执行新的任务。...RxJava 线程模型.png Scheduler是RxJava的线程任务调度器,Worker是线程任务的具体执行者。...总结 了解RxJava的线程模型、线程调度器、线程调度是非常有意义的。能够帮助我们更合理地使用RxJava。另外,RxJava的线程切换结合链式调用非常方便,比起Java使用线程操作实在是简单太多了。

1.6K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    enq: TM - contention锁争用的解决

    这两天生产上碰见个表锁争用的问题,现象就是04:00夜维一启动,应用就开始处理缓慢,AWR看,enq: TM - contention等待事件占比超过了97%, ?...contention,一般是执行DML期间,为防止对与DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁,就可能产生enq: TM - contention等待事件,若在获得TM锁的过程中发生争用...这三个会话操作,都可以正常执行,而且不会出现任何争用,因此,存在主外键约束,就需要为外键创建索引,否则在并发DML中就会出现锁争用,进而对应用产生影响, ?...可以用下面语句, SQL> SELECT * FROM (SELECT c.table_name, cc.column_name, cc.position column_positionFROM...外键supplier_id没索引,因此,夜维删除主表的操作,就会对子表加锁,和应用中删除子表操作之间,就会存在TM锁争用。 为supplier_id这个外键字段,创建单键值索引,即可解决这问题。

    1.2K20

    再忆RxJava---线程切换

    RxJava已经陆陆续续看了将近两年多了,觉得很有必要重新认识一下。而且最新github上都出了3.0了。...,启动一个线程处理我们自己写的subscribe方法。...这是出于流程图中的(1),onNext在子线程中发射(网络请求一般会自己new Thread出来执行的) (注意:此时已经有子线程处理了,所以subscribeOn其实已经没有意义了,可以不写。...Thread出来 (简单来说,如果subscribe函数中的耗时操作没有new Thread,那么就需要subscribeOn) 是否需要subscribeOn还需要注意创建retrofit的时候RxJava2CallAdapterFactory...其实也很好理解,我们的操作在A线程中执行,而A在线程B中执行,请问,我们的操作在哪个线程中执行?肯定是A啊(说B其实也没错,但是从学术角度来讲不准确)。

    51310

    RxJava 线程调度和源码阅读

    RxJava 内置了几个 Scheduler,通过 Schedulers 来获取。 Schedulers.trampoline():当其它排队的任务完成后,在当前线程排队开始执行,FIFO。...行为模式和 newThread() 差不多,区别在于 io() 的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。...然后根据外界传入的 Observer 和这个线程池封装出另一个 Observer。所以在 ObservableSubscribeOn 的对象 source 上用重新封装好的一个观察者订阅它。...且 run 方法就是用这个观察者去订阅 source。在这个例子里,ObservableSubscribeOn 中的 source 就是上层 ObservableCreate。...run 方法中是用经过若干层封装的观察者订阅最初的那个被观察者。

    1.6K30

    RxJava2--多线程调度Scheduler

    Scheduler背景 前面介绍过RxJava的基本概念与使用,可以通过RxJava发射事件,而通过Observer来接收事件。...然而我们大多数时候,会有耗时的操作,比如在子线程完成复杂的矩阵运算,文件的IO操作,网络请求,数据库读写等等,我们希望可以在子线程完成这些事情,而在主线程接收回调事件。...Scheduler家族 所使用的Scheduler主要在Schedulers这个类中,RxJava仅仅提供了以下这些调度器: Schedulers.SINGLE Schedulers.COMPUTATION...,CoreSize为1,在此调度器接收到任务后,先检查线程缓存池中,是否有空闲的线程,如果有,则复用,如果没有则创建新的线程,并加入到线程池中,如果每次都没有空闲线程使用,可以无上限的创建新线程。...Schedulers.newThread( ): 在每执行一个任务时创建一个新的线程,不具有线程缓存机制,因为创建一个新的线程比复用一个线程更耗时耗力,虽然使用Schedulers.io( )的地方,

    1.9K40

    浅析 RxJava 2.x 线程调度

    RxJava 的大名不需要多做介绍,我自己也在项目中使用RxJava也有一段时间了,抱着学习的心态,一直想更深入一点的去了解它的实现原理,当然RxJava东西还是蛮多的,不可能一篇文章就能说清楚,so...,这肯定是一个系列,在这一篇,我先尝试从 RxJava的线程控制 来切入,管中窥豹吧,我尽力,看官们随意。...产生一个字符串“Hello rxJava”, 然后在监听中打印log,subscribeOn(Schedulers.io()) 设置数据在io线程产生,observeOn(AndroidSchedulers.mainThread...怎么理解RxJava中的Observable、Observer、Scheduler 看字面就知道,Observable是被观察者,Observer是观察者,Scheduler是调度器,在RxJava实现中...下面是RxJava的实现: ?

    51410

    详解 RxJava2 的线程切换原理

    读了这篇文章你将会收获什么 RxJava2 基本的运行流程(并不会详述) RxJava2 线程切换原理 为什么 subscribeOn() 只有第一次切换有效 RxAndroid 简单分析 PS:建议您对...image RxJava2 线程切换原理 一、observeOn() 的线程切换原理 根据运行流程来看 observeOn() 执行后是得到 ObservableObserveOn 对象,那么当 ObservableObserveOn...其实它的原理和 RxJava 自带的那些线程调度器一样,如果你想了解 RxJava 的 IO 线程池,什么的可以自己看一看,我这里分析 RxAndroid 主要有以下几点原因 弄清楚 RxAndroid...这个库的具体作用 弄清楚他是怎么就能把线程切换到主线程(他是怎么提供的主线程环境) 弄清楚线程调度器的运行原理 最重要的是它相对于 RxJava 自带的那些调度器,他比较简单容易分析 正文开始 首先我们找一下入口...如何通过 RxAndroid 来切换到主线程运行,其实 RxAndroid 的核心就是 Handler ---- 总结 本篇参考 RxJava 2.1.12 与 RxAndroid:2.0.2 源码

    3K20

    深入解析JVM调优:解决OutOfMemoryError、内存泄露、线程死锁、锁争用和高CPU消耗问题

    这些问题包括OutOfMemoryError、内存泄露、线程死锁、锁争用和高CPU消耗等。在本文中,我们将深入探讨如何诊断和解决这些问题,以确保你的Java应用能够高效稳定地运行。...场景三:线程死锁 问题描述 线程死锁是指两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行。...使用工具如线程池来管理线程,避免手动创建线程时容易出现死锁。...场景四:锁争用(Lock Contention) 问题描述 锁争用是指多个线程竞争同一个锁,导致大量线程阻塞等待锁的释放,降低了应用程序的并发性能。...结论 在本文中,我们深入探讨了解决Java应用程序中的常见性能问题的方法,包括OutOfMemoryError、内存泄露、线程死锁、锁争用和高CPU消耗。

    86620

    【Android】RxJava的使用(四)线程控制 —— Scheduler

    (对RxJava还不了解的可以出门左拐) 之前的代码中,事件的发起和消费都是在同一个线程中执行,也就是说之前我们使用的RxJava是同步的~~~ 观察者模式本身的目的不就是后台处理,将处理结果回调给前台...所以,这篇为大家介绍RxJava的重要的概念——Scheduler 参考:给 Android 开发者的 RxJava 详解 (本文部分内容引用自该博客) 介绍 RxJava在不指定线程的情况下,...行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。...多次切换线程 看完上面的介绍想必对RxJava线程的切换有了一些理解,上面只是对事件的发起和消费制定了线程。如果中间有map之类的操作呢?...也就是说,map的处理和最后的消费事件show(s)都会在io线程中执行。 observeOn()可以多次使用,可以随意变换线程 小结 学会线程控制后才算是真正学会了使用RxJava。

    714120

    DBLINK分布式事务失败又遭遇RAC热点块争用

    编辑手记:在DBLINK中由于远端数据库无法正常执行分布式事务,又遭遇RAC热块争用,两者共同作用导致数据库严重故障。接下来我们从AWR报告分析入手,一步步分析并解决问题。...---此处省略大量类似输出 同时从awr中同样可以看到问题时段gc争用最为严重的为订单表中的索引IDX_ORDER_LIST_OLNBR_1,该索引为右向增长的数值索引,近一半的gc争用发生在该索引上。...如无法进行应用改造,可以针对热点表改造为hash或range hash方式分区表并针对具有右向增长性质的字段创建local索引,该种解决方案对应用透明,将热点表及索引使用hash算法将数据分散在多个段中,缓解热点块争用...,其目的就是打散这些集中访问的数据块,减少数据块被多数会话同时访问的频率,从而分散热点块的争用。...(3)如无法进行分区表改造,至少需要对热点表中具有右向增长性质的索引,如主键、日期类型及数值自增长类型字段通过hash方式创建全局分区索引,缓解热点块争用,同理,其目的也是打散这些集中访问的数据块,特别是右向增长的索引热点永远在最右端

    1.1K50

    RxJava从入门到不离不弃(五)——Scheduler线程调度

    在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。...RxJava内置的几种线程调度器 Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。...行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。...注意:observeOn() 指定的是 Subscriber 的线程,而这个 Subscriber 并不一定是 subscribe() 参数中的 Subscriber(这块参考RxJava变换部分),而是...Log.e("normal", "number:" + number); } }); 最普通用法,长出现在Retrofit+RxJava

    1.2K10

    RxJava2.X 源码分析(三):订阅线程切换

    作者博客 http://www.cherylgood.cn/ 前言 基于RxJava2.1.1 我们在前面的 RxJava2.0使用详解(一)初步分析了RxJava从创建到执行的流程。...本次我们将探索RxJava2.x线程切换的实现原理。做到知其然,知其所以然。 Ok,开始我们的探索之旅吧! 从Demo到源码 本次我们将在上次的demo基础了做点改动。 ? ?...结果分析(因为我用的是@RunWith(AndroidJUnit4.class)执行代码,所以在工作线程是AndroidJUnitRunner): 现在我们现象,后面根据现象分析原因。...存在版本切换的版本: 1、被观察者的onSubscribe在调用subscribe的线程中执行 2、被观察者的subscribe在RxJava2的RxCachedThreadScheduler-1中运行...装饰者模式的使用贯穿了RxJava2的各处(个人理解),再次体会了设计模式的魅力。 由于本篇过长,observeOn订阅者线程的切换就再分一篇吧。

    59640
    领券