代码:https://github.com/google/guava
文档:https://github.com/google/guava/wiki
maven依赖
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
</dependencies>
同步代码:
package com.example.sync;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
public class EventBusSyncDemo {
private static EventBus eventBus = new EventBus("Demo-Sync-Bus");
public static void main(String[] args) {
//注册订阅方法来接收事件
eventBus.register(new DemoSyncSubscriber());
System.out.println("publish event...");
//向 bus 中发布事件
eventBus.post("Hello Event Bus");
System.out.println("published...");
}
}
class DemoSyncSubscriber {
//订阅事件并处理
@Subscribe
public void handler(Object eventData) {
System.out.println("DemoSyncSubscriber | event data: " + eventData.toString());
}
}
异步代码:
package com.example.async;
import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.Subscribe;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class EventBusAsyncDemo {
private static AsyncEventBus eventBus = new AsyncEventBus(new DemoExecutor());
public static void main(String[] args) {
//注册订阅方法来接收事件
eventBus.register(new DemoAsyncSubscriber());
System.out.println("publish event... " + Thread.currentThread().getId());
//向 bus 中发布事件
eventBus.post("Hello Event Bus");
System.out.println("published... " + Thread.currentThread().getId());
try {
Thread.sleep(1000);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class DemoAsyncSubscriber {
@Subscribe
public void handler(Object eventData) {
System.out.println("DemoAsyncSubscriber | event data: " + eventData.toString() + " " + Thread.currentThread().getId());
}
}
class DemoExecutor implements Executor {
private List<Runnable> tasks = new ArrayList<>();
private ExecutorService executorService = Executors.newFixedThreadPool(1);
DemoExecutor() {
//起一个线程,执行发布的事件
new Thread(new Runnable() {
@Override
public void run() {
while (true){
synchronized (this){
if (tasks.size()>0){
Runnable runnable = tasks.remove(0);
executorService.execute(runnable);
}
}
}
}
}).start();
}
@Override
public void execute(@Nullable Runnable task) {
synchronized (this){
tasks.add(task);
}
}
}