最近項目中用到了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));
}
}
}
運作結果裡可以清晰的看到四個線程之間的切換。