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, List> listenerMap = new ConcurrentHashMap<>(); private static ThreadFactory sceneThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-loop-%d").build(); private static ExecutorService singleThreadSchedule = Executors.newSingleThreadScheduledExecutor(sceneThreadFactory); public static void subscribe(Class eventClass, EventHandler eventHandler) { List eventHandlerList = listenerMap.get(eventClass); if (null == eventHandlerList) { eventHandlerList = new CopyOnWriteArrayList<>(); } eventHandlerList.add(eventHandler); listenerMap.put(eventClass,eventHandlerList); } public static void publish(E event) { List 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(); } }