Google Guava EventBus Demo【QuickStart】

代码: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);
        }
    }
}

 

### Google Guava EventBus 库文档与使用示例 #### 简介 Guava 的 `EventBus` 是一种发布-订阅模式的事件总线实现,允许组件之间解耦通信。通过定义事件类并注册监听器来处理这些事件,可以简化应用程序内部的消息传递机制[^1]。 #### 基本概念 - **事件 (Events)**: 表示应用内发生的特定情况的对象实例。 - **监听者 (Listeners)**: 实现方法响应某些类型的事件对象。 - **发布者 (Publisher)**: 负责创建并向 `EventBus` 发布新事件实例的实体。 - **订阅者 (Subscriber)**: 注册到 `EventBus` 上以接收感兴趣类型事件的方法或函数。 #### 使用说明 ##### 创建和配置 `EventBus` ```java // 初始化一个新的 EventBus 对象 EventBus eventBus = new EventBus(); ``` ##### 定义事件类 ```java public class MyCustomEvent { private final String message; public MyCustomEvent(String msg) { this.message = msg; } @Override public String toString() { return "MyCustomEvent{" + "message='" + message + '\'' + '}'; } } ``` ##### 编写监听者逻辑 ```java public class EventListener { // 订阅该事件的方法名前需加上@Subscribe注解 @Subscribe public void handleMyCustomEvent(MyCustomEvent event){ System.out.println("Received custom event:" +event); } } ``` ##### 将监听者注册至 `EventBus` ```java EventListener listenerInstance = new EventListener(); // 向 EventBus 中添加监听者 eventBus.register(listenerInstance); ``` ##### 发送事件给所有已注册的监听者 ```java // 构造一个自定义事件实例 MyCustomEvent myEvent = new MyCustomEvent("Hello, world!"); // 通过调用 post 方法向所有的监听者广播此事件 eventBus.post(myEvent); ``` 以上就是如何利用 Guava 提供的 `EventBus` 来构建松散耦合的应用程序模块间通讯的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值