Guava关于JAVA中系统组件之间交互通讯(非线程之间通讯)
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中系统组件之间交互通讯(非线程之间通讯)相关推荐
- Java 中,类、类对象、泛型之间的转换
Java 中,类.类对象.泛型之间的转换 R 为非泛型 获得类 通过类型名来获得类 通过对象来获得类 通过类名字符串来获得类 通过类来获得类名字符串 通过类来获得对象 使用 R 的无参数构造器来创建对 ...
- java中解决组件重叠的问题(例如鼠标移动组件时)
java中解决组件覆盖的问题! 有时候在移动组件的时候会出现两个组件覆盖的情况,但是你想让被覆盖的组件显示出来或者不被覆盖! 在设计GUI时已经可以定义组件的叠放次序了(按摆放组件的先后顺序 ...
- java 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别
同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...
- JAVA中的前后端交互
JDBC 什么是JDBC java数据库连接(Java Database Connectivity) 有什么用 利用 Java 代码, 可以操作数据库. 怎么用 注册驱动 获取数据库连接 创建 Sta ...
- java中系统托盘的实现
很明显,JAVA中的系统托盘,如果要实现,重要的是两个类,一个是SystemTray,而另一个是TrayIcon.需要为TrayIcon设置好图片,它需要显示的信息以及右键点击的PopupMenu.P ...
- Java中的executeQuery_java execute,executeQuery和executeUpdate之间的区别
java execute,executeQuery和executeUpdate之间的区别 关注:269 答案:4 信息版本:手机版 电脑版 解决时间 2021-01-25 18:31 提问者怪咖 ...
- java中操作字符串都有哪些类,他们之间有什么区别?
java中操作字符串的类有哪些? String StringBuffer StringBuilder 区别 我们可以先看一下这几个类的继承关系图 从类的继承关系上来开的话,String和StringB ...
- Java中interrupted()和isInterrupted()之间的区别
Java中的interrupted()和isInterrupted() (interrupted() and isInterrupted() in Java) Here, we will see ho ...
- Java 中各数字类型(Double, Float, Long, Integer) 之间以及字符串之间的转换
1. 数字类型间的转换 类型 double, float, long, int 都是 Java 中原始的数字类型. Java 提供了这原始类型的包装类, 并提供了一些便于使用的方法比如类型的转换, 通 ...
最新文章
- 2.12.ECMAScript--运算符
- 【TYVJ】1359 - 收入计划(二分)
- 饥荒机器人怎么用避雷针充电_新款iPhone充电线怎么这么好看~安卓也可以用!...
- 政府门户升级改版要点
- js中使用0 “” null undefined {}需要注意
- 1622C. Set or Decrease
- 将Centos的yum源更换为阿里云源
- 19_python基础—面向对象-类结构、类属性和类方法、静态方法
- c语言编程入门文库,C语言程序设计入门:计算机和编程语言
- 防止android应用的内存泄露
- (转载)Linux的IPC命令
- 编译ffmpeg,ffplay运行出错怎么办?
- 改版更新后的领英职场不能搜索开发客户怎么办?两种方法加一个工具解决
- linux1t文件误删,linux – 复制1TB稀疏文件
- 【腾讯笔试题】记腾讯2019年暑假实习移动端开发在线笔试题
- arduino定时器控制舵机_Arduino通过串口控制舵机角度
- Alphabetic Removals(水题)
- 编写Test3.jsp,在JSP页面中静态包含文件Sqrt.jsp(该页面计算数据的算术平方根)。要求程序有两个文件,主文件静态包含一个能够计算数据的算术平方根的页面。
- AR客户对账单(上月欠款)
- 搜索计算机硬盘的索引恢复,[转载]Chkdsk—磁盘查错修复命令
热门文章
- 吴恩达机器学习笔记:(五)区别于微积分的正规方程求解最优解
- 2022年全球及中国面粉混合物行业发展态势与消费需求前景调查报告
- 中国靶材行业投资价值与发展机遇研究报告2022版
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
- acm java_ACM Java Native SDK 概述
- 32位的cpu不能安装linux_Python3.5.2 安装教程【64位/32位】
- 供销合作社对话中国农民丰收节交易会 谋定为农服务主业
- Java使用Future设置方法超时
- js 导出到excel
- 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3