手写代码实现EventBus

来源:互联网 发布:mac java环境变量设置 编辑:程序博客网 时间:2024/05/16 08:50

日志系统做的差不多了,bug不算多也不少,尤其是我的bug,大概有20来个,其他人的bug反而比较少,总结了两点(1)系统之前的bug也提了给我,所以我的bug增加了一倍(2)我负责的模块涉及比较广,很多bug的确是开发时没想到。bug都改完了,剩余了都交给同事了。

手写代码实现EventBus今天晚上要去上海出差,下午有点时间写了写其他的代码。上一篇我们介绍了如果利用guava的eventbus完成进程内的事件监听和异步调用。大体看了下源代码并没有深究,感觉还是可以手写一个简单的demo的,这样对eventbus的使用会更加熟悉,首先看一下eventbus中有一些核心的概念和类。

A.Handler 事件处理者(监听器)

当我们异步post数据的时候,我们的目的就是让处理者来处理我们的数据。这个处理者就是handler,也可以称之为监听器。我们需要在运行时动态注册这个处理器,或者在服务启动的时候注册该处理器。

B.@Subscribe注解

被Subscribe注解修饰的方法,其类实例就是事件的处理者。而eventbus如何知道这个关系呢,原因在于当我们注册该事件时,eventbus会根据Subscribe得到被监听的方法的参数,将参数作为key,handler作为value存储在其自身维护的map中。

所以说白了,eventbus就两个核心的方法。第一个是registe,注册。第二个是post,提交。注册的目的是让事件管理器维护好handler与param的关系,post是从map中找到对应的handler处理该事件。处理的方式有两种,第一同步,同步执行会阻塞线程,第二异步,异步不会阻塞线程,因为它的执行是在另外一个子线程中。所以我们设计的时候是基于线程池做的。

(1)首先我们定义一个EventBus的接口:

手写代码实现EventBus

(2)自定义实现类:

手写代码实现EventBus

这是我们自己的实现,其构造方法有两个,当什么都不传递的时候默认是同步方式,如果传入了一个线程池对象,则我们认为是异步的。在类中,我们还内置了EventManager这个管理器的实例,用以维护handler与事件的关系。并且由于实现了IEventBus,所以要重写registe方法和post方法:

<1>registe方法

手写代码实现EventBus

<2>post方法

手写代码实现EventBus

(3)EventManager事件管理器,管理器在registeListener方法中,通过判断注解SubscribMethod在哪个方法上定义的,从而获取事件参数作为key。

手写代码实现EventBus

(4)SubscribMethod注解

手写代码实现EventBus

(5)处理器(监听器)

手写代码实现EventBus

(6)客户端如何使用:

手写代码实现EventBus

下面我们就进行一个测试:

(1)同步调用时,发送事件,事件执行2000毫秒,主线程执行5000毫秒,合计约为7000毫秒,因为同步执行会阻塞。

手写代码实现EventBus

(2)异步调用时,发送事件,事件耗时2000毫秒,主线程执行5000毫秒,合计约为5000毫秒,因为异步执行不会阻塞。

手写代码实现EventBus

如此,我们就实现了一个简单版的eventbus,当然没有太注重代码的质量,仅仅是依赖线程池封装了一下,不过我想强调的是eventbus的核心思想以及使用方式,如果大家能够明白这些,那使用eventbus就不在话下了。有时间我会仔细研究下其源代码,看看源代码和我们自己的实现到底差别在哪里。

0 0
原创粉丝点击