2019独角兽企业重金招聘Python工程师标准>>>

Guava EventBus组件
// Class is typically registered by the container.
class EventBusChangeRecorder {@Subscribe public void recordCustomerChange(ChangeEvent e) {recordChange(e.getChange());}
}
// somewhere during initialization
eventBus.register(new EventBusChangeRecorder());
// much later
public void changeCustomer() {ChangeEvent event = getChangeEvent();eventBus.post(event);
}
使用方式,定义evenBus实例,通过register方法将需要调用的组件注册到eventBus中,然后使用eventBus.post(event)方式实现组件交互,event 问一个时间参数,可以理解为,上列中EventBusChangeRecord.recordCustomerChange 的ChangeEvent 参数。

官网文档:

EventBus allows publish-subscribe-style communication between components without requiring the components to explicitly register with one another (and thus be aware of each other). It is designed exclusively to replace traditional Java in-process event distribution using explicit registration. It is not a general-purpose publish-subscribe system, nor is it intended for interprocess communication.

@Subscribe 定义当调用eventBus.post时,使用EventBusChangeRecorder中的哪个方法进行相应。
EventBus内部机制:
调用EventBus.register : 将需要调用的组件传入,如上列中的EventBusChangeRecorder对象实例,EventBus会通过反射以及上面的@Subscribe注释,得到一个SetMultiMap<Class<?> , EventHandler> 的集合。简单说就是找出需要调用组件的哪个方法,如recordCustomerChange(ChangeEvent e)
需要注意的是,通过这个方法要求传入的组件的接口方法有且只能有一个参数。
调用EventBus 的 post(Object event)方法 : 这里面有两部,找到任何可能的方法和参数组合将组合放到一个ConcurrentLinkedQueue<EventWithHandler>中,然后循环从Queue中拿出EventWithHandler 进行调用。
就这么简单~~ , 这所有的事情是在一个线程中完成的,只是EvenBus 为它的成员变量使用了 ThreadLocal 保证线程并发下的问题。

转载于:https://my.oschina.net/u/194300/blog/217883

Guava关于JAVA中系统组件之间交互通讯(非线程之间通讯)相关推荐

  1. Java 中,类、类对象、泛型之间的转换

    Java 中,类.类对象.泛型之间的转换 R 为非泛型 获得类 通过类型名来获得类 通过对象来获得类 通过类名字符串来获得类 通过类来获得类名字符串 通过类来获得对象 使用 R 的无参数构造器来创建对 ...

  2. java中解决组件重叠的问题(例如鼠标移动组件时)

    java中解决组件覆盖的问题!      有时候在移动组件的时候会出现两个组件覆盖的情况,但是你想让被覆盖的组件显示出来或者不被覆盖! 在设计GUI时已经可以定义组件的叠放次序了(按摆放组件的先后顺序 ...

  3. java 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别

    同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...

  4. JAVA中的前后端交互

    JDBC 什么是JDBC java数据库连接(Java Database Connectivity) 有什么用 利用 Java 代码, 可以操作数据库. 怎么用 注册驱动 获取数据库连接 创建 Sta ...

  5. java中系统托盘的实现

    很明显,JAVA中的系统托盘,如果要实现,重要的是两个类,一个是SystemTray,而另一个是TrayIcon.需要为TrayIcon设置好图片,它需要显示的信息以及右键点击的PopupMenu.P ...

  6. Java中的executeQuery_java execute,executeQuery和executeUpdate之间的区别

    java execute,executeQuery和executeUpdate之间的区别 关注:269  答案:4  信息版本:手机版 电脑版 解决时间 2021-01-25 18:31 提问者怪咖 ...

  7. java中操作字符串都有哪些类,他们之间有什么区别?

    java中操作字符串的类有哪些? String StringBuffer StringBuilder 区别 我们可以先看一下这几个类的继承关系图 从类的继承关系上来开的话,String和StringB ...

  8. Java中interrupted()和isInterrupted()之间的区别

    Java中的interrupted()和isInterrupted() (interrupted() and isInterrupted() in Java) Here, we will see ho ...

  9. Java 中各数字类型(Double, Float, Long, Integer) 之间以及字符串之间的转换

    1. 数字类型间的转换 类型 double, float, long, int 都是 Java 中原始的数字类型. Java 提供了这原始类型的包装类, 并提供了一些便于使用的方法比如类型的转换, 通 ...

最新文章

  1. 2.12.ECMAScript--运算符
  2. 【TYVJ】1359 - 收入计划(二分)
  3. 饥荒机器人怎么用避雷针充电_新款iPhone充电线怎么这么好看~安卓也可以用!...
  4. 政府门户升级改版要点
  5. js中使用0 “” null undefined {}需要注意
  6. 1622C. Set or Decrease
  7. 将Centos的yum源更换为阿里云源
  8. 19_python基础—面向对象-类结构、类属性和类方法、静态方法
  9. c语言编程入门文库,C语言程序设计入门:计算机和编程语言
  10. 防止android应用的内存泄露
  11. (转载)Linux的IPC命令
  12. 编译ffmpeg,ffplay运行出错怎么办?
  13. 改版更新后的领英职场不能搜索开发客户怎么办?两种方法加一个工具解决
  14. linux1t文件误删,linux – 复制1TB稀疏文件
  15. 【腾讯笔试题】记腾讯2019年暑假实习移动端开发在线笔试题
  16. arduino定时器控制舵机_Arduino通过串口控制舵机角度
  17. Alphabetic Removals(水题)
  18. 编写Test3.jsp,在JSP页面中静态包含文件Sqrt.jsp(该页面计算数据的算术平方根)。要求程序有两个文件,主文件静态包含一个能够计算数据的算术平方根的页面。
  19. AR客户对账单(上月欠款)
  20. 搜索计算机硬盘的索引恢复,[转载]Chkdsk—磁盘查错修复命令

热门文章

  1. 吴恩达机器学习笔记:(五)区别于微积分的正规方程求解最优解
  2. 2022年全球及中国面粉混合物行业发展态势与消费需求前景调查报告
  3. 中国靶材行业投资价值与发展机遇研究报告2022版
  4. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
  5. acm java_ACM Java Native SDK 概述
  6. 32位的cpu不能安装linux_Python3.5.2 安装教程【64位/32位】
  7. 供销合作社对话中国农民丰收节交易会 谋定为农服务主业
  8. Java使用Future设置方法超时
  9. js 导出到excel
  10. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3