java eventbus 原理_EventBus原理

java eventbus 原理_EventBus原理EventBus 实现了观察者模式 使用方法非常简单 可参考 有用的 Guava 二 这篇文章主要讲解 EventBus 的实现原理 一言以蔽之 EventBus 内部有一个 map 当 register 时往 map 中增加一个元素 key 为事件的类型 value 为观察者 post 时根据事件类型找到观察者之后 对其反射调用 下面我们从 register 方法开始 publicvoidre Object

EventBus实现了观察者模式,使用方法非常简单,可参考:有用的Guava(二)

这篇文章主要讲解EventBus的实现原理。

一言以蔽之:EventBus内部有一个map,当register时往map中增加一个元素(key为事件的类型,value为观察者),post时根据事件类型找到观察者之后,对其反射调用。

下面我们从register方法开始:

public void register(Object object) {

Multimap, EventHandler> methodsInListener =

finder.findAllHandlers(object);

handlersByTypeLock.writeLock().lock();

try {

handlersByType.putAll(methodsInListener);

} finally {

handlersByTypeLock.writeLock().unlock();

}

}

调用eventBus.register(new Event())时,会将事件类型及观察者(封装为EventHandler)放置在SetMultimap, EventHandler> handlersByType中,这是一个线程安全的对象容器,卸载事件也是在这个容器中做移除操作。根据事件类型查找观察者时使用了策略模式,HandlerFindingStrategy finder做为策略接口,目前只有一个策略实现AnnotatedHandlerFinder(查找带有Subscribe注解的方法)。

有了这样一个map,调用post时只需要根据类型找到观察者就行了:

public void post(Object event) {

Set> dispatchTypes = flattenHierarchy(event.getClass());

boolean dispatched = false;

for (Class> eventType : dispatchTypes) {

handlersByTypeLock.readLock().lock();

try {

Set wrappers = handlersByType.get(eventType);

if (!wrappers.isEmpty()) {

dispatched = true;

for (EventHandler wrapper : wrappers) {

enqueueEvent(event, wrapper);

}

}

} finally {

handlersByTypeLock.readLock().unlock();

}

}

if (!dispatched && !(event instanceof DeadEvent)) {

post(new DeadEvent(this, event));

}

dispatchQueuedEvents();

}

这里查找到参数匹配的EventHandler后并没有立刻执行反射调用,而是分发到了事件队列(ThreadLocal> eventsToDispatch)中,当所有事件分发完毕之后,事件队列做统一的事件消费。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208551.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:19
下一篇 2026年3月19日 上午11:19


相关推荐

  • GCC命令编译

    GCC命令编译GCC命令

    2022年10月13日
    4
  • pytest的使用_java中方法的调用

    pytest的使用_java中方法的调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月30日
    16
  • 通达信客户端程序化下单

    通达信客户端程序化下单通达信是股票市场上最常用的客户端之一 几乎所有的券商都有通达信客户端 而很多朋友在盘中都想有一个自己的下单程序 下面从 2 方面探讨一下通过通达信自动化下单的办法 一 利用模拟按键类程序利用通达信的客户端界面本身 获取各个控件的类型和实例名 通过 AUTOIT 等脚本程序实现通达信客户端的自动化下单 此种方法简单方便 都是通过 windows 的库函数的调用来模拟消息 从而实现自动化下单 但是此方法只

    2026年3月17日
    3
  • 自动构建(CICD)

    自动构建(CICD)Docker、Kubernetes的CICD实现思路Jenkins是一个比较流行的持续集成工具GitLab是存储镜像的镜像仓库由客户端将代码push推送到git仓库,gitlab上配置了一个webHook的东西可以触发Jenkins的构建。进入到Jenkins虚线范围内,它所做的事情非常多,从mvn构建代码,对代码进行静态分析,做单元测试,测试通过之后就可以build镜像,镜像构建成功后…

    2022年5月3日
    67
  • 整数规划matlab实例,整数规划matlab[通俗易懂]

    整数规划matlab实例,整数规划matlab[通俗易懂]整数规划matlabTag内容描述:1、例已知非线性整数规划为maxz=x12+x22+3×32+4×42+2×52-8×1-2×2-3×3-x4-2x5s.t.0xi99,i=1,2,5×1+x2+x3+x4+x5400x1+2×2+2×3+x4+6x58002x1+x2+6x3200x3+x4+5×5200(1)编写M文件mengte.m,定义目标函数f和约束向量函数g,程序如下:funct…

    2022年7月12日
    22
  • cad计算机快捷键命令大全,cad快捷键命令有哪些?常用cad快捷键命令大全

    cad计算机快捷键命令大全,cad快捷键命令有哪些?常用cad快捷键命令大全想要熟悉的掌握 CAD 软件 那么我们的快捷键也是我们必须要掌握的 很多朋友在刚开始接触到 CAD 软件的时候不会使用快捷键或者不知道快捷键的命令 我们操作的速度就相当的麻烦 所以今天呢电脑知识学习网就把这些快捷键的命令分享给大家 希望对大家有所帮助 cad 快捷键命令有哪些一 常用功能键 F1 获取帮助 F2 实现作图窗和文本窗口的切换 F3 控制是否实现对象自动捕捉 F4 数字化仪控制 F5 等轴测平面

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号