EventBus 消息的线程切换模型与实现原理 (3)

但是其实这里让开发者自己去配置,也很难配置一个合理的线程池的拒绝策略,拒绝时必然会放弃一些任务,也就是会放弃掉一些事件,任何放弃策略都是不合适的,这在 EventBus 的使用中,表现出来就是出现逻辑错误,该收到的事件,收不到了。所以你看,这里无界队列不合适,但是不用它呢也不合适,唯一的办法就是合理的使用 ASYNC,只在必要且合理的情况下,才去使用它。

三. 小结时刻

到这里基本上 EventBus 在分发事件时的线程切换,就讲清除了,很多资料里其实都写了他们可以切换线程,但是对于一些使用的细节,描述的并不清除,正好借此文,把 EventBus 的线程切换的直接讲清除。

EventBus 也是简历上比较常见的高频词,我在面试的过程中,也经常会问面试者,关于它是如何做到线程切换的问题。但是正因为它简单易用,其实很多时候我们都忽略了它的实现细节。

今天就到这里,小结一下:

1. EventBus 可以通过 threadMode 来配置接收事件的线程。

2. MAIN 和 MAIN_ORDERED 都会在主线程接收事件,区别在于是否区分,发生事件的线程是否是主线程。

3. BACKGROUND 确保在子线程中接收线程,它会通过线程池,使用一个线程循环处理所有的事件。所以事件的执行时机,会受到事件队列前面的事件处理效率的影响。

4. ASYNC 确保在子线程中接收事件,区别于 BACKGROUND,ASYNC 会每次向线程池中发送任务,通过线程池的调度去执行。但是因为线程池采用的是无界队列,会导致 ASYNC 待处理的事件太多时,会导致 OOM。

本文就到这里,本文对你有帮助吗?留言、转发、收藏是最大的支持,谢谢!

本文首发自公众号「承香墨影」,欢迎关注获取最新的原创文章。公众号后台回复成长『成长』,将会得到我准备的学习资料,。

EventBus 消息的线程切换模型与实现原理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspjwy.html