设计一个线程安全的触发器

下面,我们将为Trigger类添加一些更复杂的功能:

  1. 异常处理:确保事件处理期间发生的任何异常都不会导致整个触发器系统崩溃。
  2. 同步:确保事件处理是线程安全的,防止并发问题。
  3. 事件参数:允许事件处理函数接收参数。
  4. 事件链:允许一个事件触发另一个事件。

以下是更新后的Trigger类,包含了这些复杂功能:

java
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Trigger {
private Map<T, Runnable> eventHandlers = new HashMap<>();
private ExecutorService executorService = Executors.newCachedThreadPool();

// 注册事件和对应的处理函数
public void registerEvent(T event, Runnable handler) {
    eventHandlers.put(event, handler);
}

// 触发事件,可以传递参数
public void triggerEvent(T event, Object... args) {
    if (eventHandlers.containsKey(event)) {
        executorService.submit(() -> {
            try {
                // 创建一个带参数的适配器,以便传递给处理函数
                eventHandlers.get(event).run();
            } catch (Exception e) {
                System.err.println("Error occurred while handling event: " + event);
                e.printStackTrace();
            }
        });
    } else {
        System.out.println("No handler registered for event: " + event);
    }
}

// 注册事件链,一个事件触发另一个事件
public void registerEventChain(T event, T chainedEvent) {
    if (eventHandlers.containsKey(chainedEvent)) {
        registerEvent(event, () -> {
            System.out.println("Chained event triggered: " + chainedEvent);
            triggerEvent(chainedEvent);
        });
    } else {
        System.out.println("No handler registered for chained event: " + chainedEvent);
    }
}

// 关闭线程池
public void shutdown() {
    executorService.shutdown();
}

public static void main(String[] args) {
    Trigger<String> trigger = new Trigger<>();

    // 注册登录事件处理函数
    trigger.registerEvent("login", () -> {
        System.out.println("User logged in.");
        // 登录逻辑...
    });

    // 注册登出事件处理函数
    trigger.registerEvent("logout", () -> {
        System.out.println("User logged out.");
        // 登出逻辑...
    });

    // 注册一个事件链,登录后触发检查用户权限事件
    trigger.registerEventChain("login", "checkUserPermissions");

    // 注册检查用户权限事件处理函数
    trigger.registerEvent("checkUserPermissions", () -> {
        System.out.println("Checking user permissions...");
        // 检查用户权限逻辑...
    });

    // 触发登录事件,这将自动触发检查用户权限事件
    trigger.triggerEvent("login");

    // 触发登出事件
    trigger.triggerEvent("logout");

    // 关闭线程池
    trigger.shutdown();
}

}

在这个例子中,我们添加了以下功能:

  • 异常处理:通过在单独的线程中运行事件处理函数,并捕获可能抛出的任何异常,确保了系统的稳定性。
  • 同步:通过使用线程池ExecutorService来处理事件,我们保证了事件处理的线程安全。
  • 事件参数:triggerEvent方法现在可以接收一个可变参数列表,这样就可以传递参数给事件处理函数。不过,在这个例子中,我们没有具体实现如何将这些参数传递给事件处理函数,因为Runnable接口不接收参数。实际应用中,可以自定义一个Consumer接口或者使用其他方式来处理参数。
  • 事件链:通过registerEventChain方法,我们允许一个事件触发另一个事件。当第一个事件处理完成后,第二个事件会被自动触发。

请注意,这个示例仍然是一个简化的模拟,实际应用中可能需要更复杂的设计,比如更精细的线程控制、事件参数传递机制、事件处理结果的反馈等。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值