| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package com.its.common.event;
- import com.google.common.util.concurrent.ThreadFactoryBuilder;
- import lombok.extern.slf4j.Slf4j;
- import java.util.List;
- import java.util.Map;
- import java.util.Objects;
- import java.util.concurrent.*;
- @Slf4j
- public class EventBus {
- private static Map<Class<? extends Event>, List<EventHandler>> listenerMap = new ConcurrentHashMap<>();
- private static ThreadFactory sceneThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-loop-%d").build();
- private static ExecutorService singleThreadSchedule = Executors.newSingleThreadScheduledExecutor(sceneThreadFactory);
- public static <E extends Event> void subscribe(Class<? extends Event> eventClass, EventHandler<E> eventHandler) {
- List<EventHandler> eventHandlerList = listenerMap.get(eventClass);
- if (null == eventHandlerList) {
- eventHandlerList = new CopyOnWriteArrayList<>();
- }
- eventHandlerList.add(eventHandler);
- listenerMap.put(eventClass,eventHandlerList);
- }
- public static <E extends Event> void publish(E event) {
- List<EventHandler> handlerList = listenerMap.get(event.getClass());
- if (!Objects.isNull(handlerList)) {
- for (EventHandler eventHandler: handlerList) {
- singleThreadSchedule.execute( () -> eventHandler.handle(event));
- }
- }
- }
- public static void close() throws Exception {
- listenerMap.clear();
- }
- }
|