Java 模拟消息驱动

1、定义消息接收接口

// ==========================
// 1. 消息接收接口(你要的:单独接口)
// ==========================
public interface IMessageReceiver {
    // 消息到达时被调用
    void onMessage(String message);
}

2、实现消息接收

import lombok.extern.slf4j.Slf4j;

// ==========================
// 2. 接口实现类(你要的:单独实现类)
// ==========================
@Slf4j
public class MessageReceiverImpl implements IMessageReceiver {

    // 真正的消息处理逻辑
    @Override
    public void onMessage(String message) {
        log.info("【实现类处理消息】" + message);
    }
}

3、消息处理中心

import java.util.concurrent.*;

// ==========================
// 1. 消息中心(纯内存,无中间件)
// 真正的消息驱动:消息到达 → 自动唤醒执行
// ==========================
public class MessageCenter {
    // 【真正安全】标准线程池,固定2个核心线程,队列容量10
    private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2,                          // 核心线程
            4,                          // 最大线程
            60L, TimeUnit.SECONDS,      // 空闲回收
            new ArrayBlockingQueue<>(10) // 任务队列
    );

    private static IMessageReceiver receiver;

    // 【处理方】注册:我要接收消息
    public static void register(IMessageReceiver r) {
        receiver = r;
    }

    // 【发送方】发送:只发消息,不关心处理
    public static void send(String msg) {
        // 关键:消息到达 → 系统自动唤醒执行,无循环、无等待
        executor.execute(() -> {
            if (receiver != null) {
                receiver.onMessage(msg); // 自动回调
            }
        });
    }
}

4、主程序

import lombok.extern.slf4j.Slf4j;

// ==========================
// 主程序(无阻塞、无轮询)
// ==========================
@Slf4j
public class TrueMessageDriven {
    public static void main(String[] args) {
        System.out.println("主线程开始");

        // 1. 创建 接口实现类
        IMessageReceiver receiver = new MessageReceiverImpl();

        // 2. 注册到总线
        MessageCenter.register(receiver);

        // 发送消息
        MessageCenter.send("用户登录成功");

        for (int i = 0; i < 10; i++) {
            MessageCenter.send("文件下载完成");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                log.error("线程中断", e);
            }
        }

        log.info("主线程结束,不阻塞、不轮询、无中间件");
    }
}

 

posted @ 2026-05-27 09:38  都是城市惹的祸  阅读(3)  评论(0)    收藏  举报