最近项目中用到了GUAVA的eventbus来做异步操作,感觉很顺手,这里写了个小demo,作为备忘:(引入guava 18.0版本)
1.AppEventBus类:用来注册,执行和卸载事件,内部实例化了一个AsyncEventBus类,用线程池开了四个线程。
2.StringMessageEvent:事件类。
3.StringMessageListener类:监听者,会实例化一个AppEventBus和一个具体业务处理类StringMsgHandler。当监听到StringMessageEvent事件的时候,会执行 带有 @Subscribe 注解的方法。
4.StringMsgHandler:具体处理业务的类。
上代码:
public class AppEventBus { private final AsyncEventBus eventBus; public AppEventBus(){ this.eventBus = new AsyncEventBus(Executors.newFixedThreadPool(4)); } /** * 注册事件 */ public void register(Object object){ eventBus.register(object); } /** * 执行事件 * @param object */ public void post(Object object){ eventBus.post(object); } /** * 卸载事件 * @param object */ public void unRegister(Object object){ eventBus.unregister(object); } }
public class StringMessageEvent { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public StringMessageEvent(String message) { this.message = message; } }
public class StringMessageListener { private AppEventBus eventBus; private StringMsgHandler msgHandler; public StringMessageListener(AppEventBus eventBus, StringMsgHandler msgHandler) { this.eventBus = eventBus; this.msgHandler = msgHandler; } public void init(){ this.eventBus.register(this); } @Subscribe public void handle(StringMessageEvent messageEvent){ for(int i = 0;i<100;i++) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(messageEvent.getMessage()).append(" thread : ").append(Thread.currentThread().getId()); msgHandler.printMsg(stringBuilder.toString()); } } }
public class StringMsgHandler { public void printMsg(String msg){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(msg).append(" in ").append(new Date()); System.out.println(stringBuilder.toString()); } } //test类
public class TestGuava { public static void main(String[] args){ AppEventBus appEventBus = new AppEventBus(); StringMsgHandler handler = new StringMsgHandler(); StringMessageListener listener = new StringMessageListener(appEventBus,handler); listener.init(); for(int i = 0;i<10;i++) { appEventBus.post(new StringMessageEvent("hello World" + i)); } } } 运行结果里可以清晰的看到四个线程之间的切换。