【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )

简介: 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )

文章目录

一、消息中心

二、订阅方法时的注解

三、订阅方法封装

四、订阅对象-方法封装

五、线程模式





一、消息中心


此处暂时只实现一个单例类 , 后续 注册订阅者 , 处理事件传递 , 取消注册订阅者 , 等功能在该单例类的基础上扩展 ;


package com.eventbus_demo.myeventbus;
public class MyEventBus {
    /**
     * 全局单例
     */
    private static MyEventBus instance;
    private MyEventBus() {
    }
    public static MyEventBus getInstance() {
        if (instance == null) {
            instance = new MyEventBus();
        }
        return instance;
    }
}




二、订阅方法时的注解


定义一个注解 , 该注解用于修饰方法 ElementType.METHOD , 在运行时 , 用户调用 register 注册订阅者时 , 会分析哪个方法中存在该注解 , 将有注解的方法保存起来 , 以便之后的调用 ;


该注解需要保存到运行时 RetentionPolicy.RUNTIME ;


package com.eventbus_demo.myeventbus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)     // 该注解保留到运行时
@Target(ElementType.METHOD)             // 该注解作用于方法
public @interface MySubscribe {
    /**
     * 注解属性, 设置线程模式, 默认是 POSTING,
     *      即在发布线程调用订阅方法
     * @return
     */
    MyThreadMode threadMode() default MyThreadMode.POSTING;
}



三、订阅方法封装


将 订阅方法 , 订阅方法的线程模式 , 订阅方法接收的事件类型 , 封装到类中 ;


package com.eventbus_demo.myeventbus;
import java.lang.reflect.Method;
/**
 * 该类中用于保存订阅方法相关信息
 */
public class MySubscriberMethod {
    /**
     * 订阅方法
     */
    private final Method method;
    /**
     * 订阅方法的线程模式
     */
    private final MyThreadMode threadMode;
    /**
     * 订阅方法接收的事件类型
     */
    private final Class<?> eventType;
    public MySubscriberMethod(Method method, MyThreadMode threadMode, Class<?> eventType) {
        this.method = method;
        this.threadMode = threadMode;
        this.eventType = eventType;
    }
    public Method getMethod() {
        return method;
    }
    public MyThreadMode getThreadMode() {
        return threadMode;
    }
    public Class<?> getEventType() {
        return eventType;
    }
}






四、订阅对象-方法封装


再次进行封装 , 将 订阅者对象 和 订阅方法 , 封装到一个类中 , 这个类对象是 注册 , 取消注册 , 事件调用 操作的基本单元 ;


获取到该类的对象 , 就可以执行订阅方法 ;


package com.eventbus_demo.myeventbus;
/**
 * 封装 订阅者对象 与 订阅方法
 */
public class MySubscription {
    /**
     * 订阅者对象
     */
    private final Object subscriber;
    /**
     * 订阅方法
     */
    private final MySubscriberMethod subscriberMethod;
    public MySubscription(Object subscriber, MySubscriberMethod subscriberMethod) {
        this.subscriber = subscriber;
        this.subscriberMethod = subscriberMethod;
    }
    public Object getSubscriber() {
        return subscriber;
    }
    public MySubscriberMethod getSubscriberMethod() {
        return subscriberMethod;
    }
}





五、线程模式


仿照 EventBus 的线程模式 , 直接照搬过来 ;


线程模式用法参考 【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC) ;


package com.eventbus_demo.myeventbus;
/**
 * 直接使用 EventBus 中的现成模式
 */
public enum MyThreadMode {
    POSTING,
    MAIN,
    MAIN_ORDERED,
    BACKGROUND,
    ASYNC
}


目录
相关文章
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
580 3
|
10月前
|
存储 Oracle Java
|
12月前
|
Java
创建线程的方法
Java中实现多线程有四种方式:1. 继承Thread类,简单但占用继承机会,耦合度高;2. 实现Runnable接口,推荐方式,任务与线程解耦,支持Lambda;3. 实现Callable接口配合FutureTask,可获取返回值和异常;4. 使用线程池(ExecutorService),企业推荐,管理线程生命周期,提升性能,支持多种线程池类型。
352 1
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
844 5
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
325 0
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
493 83

热门文章

最新文章