From ae4c50f60162da9e6692580f965447a82bb9ac6e Mon Sep 17 00:00:00 2001 From: icanci Date: Tue, 29 Nov 2022 00:17:03 +0800 Subject: [PATCH 1/2] event --- .../icanci/rec/spi/event/AbstractEventDispatcher.java | 10 ++-------- .../icanci/rec/spi/event/DefaultEventDispatcher.java | 4 ++-- .../{AnonymityEventHandler.java => EventHandler.java} | 4 ++-- ...NamedThreadFactory.java => EventThreadFactory.java} | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) rename rec-spi/src/main/java/cn/icanci/rec/spi/event/{AnonymityEventHandler.java => EventHandler.java} (73%) rename rec-spi/src/main/java/cn/icanci/rec/spi/event/{NamedThreadFactory.java => EventThreadFactory.java} (87%) diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java index bc21f85..649a52a 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java @@ -3,8 +3,6 @@ package cn.icanci.rec.spi.event; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; @@ -47,17 +45,13 @@ public abstract class AbstractEventDispatcher implements EventDispatcher, Applic */ protected Executor taskExecutor; - /**锁*/ - private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final Object lock = new Object(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; - try { - lock.writeLock().lock(); + synchronized (lock) { register(); - } finally { - lock.writeLock().unlock(); } } diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java index 3b88b0a..7da1fc3 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java @@ -92,7 +92,7 @@ public class DefaultEventDispatcher extends AbstractEventDispatcher { @Override protected Executor getTaskExecutor() { if (taskExecutor == null) { - taskExecutor = Executors.newCachedThreadPool(new NamedThreadFactory("beedong-event", true)); + taskExecutor = Executors.newCachedThreadPool(new EventThreadFactory("rec-event", true)); } return taskExecutor; } @@ -150,7 +150,7 @@ public class DefaultEventDispatcher extends AbstractEventDispatcher { } : baseEventListeners -> { Executor taskExecutor = getTaskExecutor(); for (final BaseEventListener listener : baseEventListeners) { - taskExecutor.execute(new AnonymityEventHandler(baseEvent, listener)); + taskExecutor.execute(new EventHandler(baseEvent, listener)); } }; diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/AnonymityEventHandler.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventHandler.java similarity index 73% rename from rec-spi/src/main/java/cn/icanci/rec/spi/event/AnonymityEventHandler.java rename to rec-spi/src/main/java/cn/icanci/rec/spi/event/EventHandler.java index 6810aa5..4157747 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/AnonymityEventHandler.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventHandler.java @@ -6,14 +6,14 @@ package cn.icanci.rec.spi.event; * @author icanci * @since 1.0 Created in 2022/11/11 18:01 */ -public class AnonymityEventHandler implements Runnable { +public class EventHandler implements Runnable { /** 事件 */ private BaseEvent event; /** 事件监听器 */ private BaseEventListener listener; - public AnonymityEventHandler(BaseEvent event, BaseEventListener listener) { + public EventHandler(BaseEvent event, BaseEventListener listener) { this.event = event; this.listener = listener; } diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/NamedThreadFactory.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java similarity index 87% rename from rec-spi/src/main/java/cn/icanci/rec/spi/event/NamedThreadFactory.java rename to rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java index 82cb910..cd05019 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/NamedThreadFactory.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java @@ -7,7 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; * @author icanci * @since 1.0 Created in 2022/11/11 18:01 */ -public class NamedThreadFactory implements ThreadFactory { +public class EventThreadFactory implements ThreadFactory { private final AtomicInteger threadNum = new AtomicInteger(1); @@ -17,7 +17,7 @@ public class NamedThreadFactory implements ThreadFactory { private final ThreadGroup group; - public NamedThreadFactory(String prefix, boolean daemon) { + public EventThreadFactory(String prefix, boolean daemon) { this.prefix = prefix + "-thread-"; this.daemon = daemon; SecurityManager s = System.getSecurityManager(); -- Gitee From 64f2a31f6342d9dc1000603cf99c4b1b4884d69d Mon Sep 17 00:00:00 2001 From: icanci Date: Tue, 29 Nov 2022 00:23:18 +0800 Subject: [PATCH 2/2] event --- .../spi/event/AbstractEventDispatcher.java | 35 ++++++++++--------- .../rec/spi/event/DefaultEventDispatcher.java | 25 +------------ .../rec/spi/event/EventThreadFactory.java | 34 ------------------ 3 files changed, 19 insertions(+), 75 deletions(-) delete mode 100644 rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java index 649a52a..9b5b592 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/AbstractEventDispatcher.java @@ -1,8 +1,7 @@ package cn.icanci.rec.spi.event; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; +import java.util.concurrent.*; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; @@ -19,31 +18,38 @@ public abstract class AbstractEventDispatcher implements EventDispatcher, Applic * Spring 容器 */ protected ApplicationContext applicationContext; - /** * 事件监听器列表 */ protected Map, List> eventListMap = new ConcurrentHashMap<>(); - /** * 监听器 */ protected List listeners = new LinkedList(); - /** * 注册事件类型 */ protected Set> eventClasses = new HashSet<>(); - /** * 排序器 */ protected static final ListenerComparator LISTENER_COMPARATOR = new ListenerComparator(); - /** - * Asynchronous executor + * 线程池核心大小 + */ + private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors(); + /** + * 线程池 */ - protected Executor taskExecutor; + protected static final ThreadPoolExecutor eventPool = new ThreadPoolExecutor(CORE_SIZE, // + CORE_SIZE << 1, // + 60L, // + TimeUnit.SECONDS, // + new LinkedBlockingQueue<>(2000), // + runnable -> new Thread(runnable, "AbstractEventDispatcher Pool-" + runnable.hashCode()), // + (r, executor) -> { + throw new RuntimeException("AbstractEventDispatcher Pool is EXHAUSTED!"); + }); private final Object lock = new Object(); @@ -65,12 +71,7 @@ public abstract class AbstractEventDispatcher implements EventDispatcher, Applic * * @return 事件执行线程池 */ - protected abstract Executor getTaskExecutor(); - - /** - * 设置任务执行器 - * - * @param taskExecutor 事件执行线程池 - */ - public abstract void setTaskExecutor(Executor taskExecutor); + protected Executor getTaskPool() { + return eventPool; + } } diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java index 7da1fc3..af9d2b3 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.Executor; -import java.util.concurrent.Executors; import java.util.function.Consumer; /** @@ -84,28 +83,6 @@ public class DefaultEventDispatcher extends AbstractEventDispatcher { return eventClass == actualTypeArgument; } - /** - * 获取任务执行器 - * - * @return 任务执行器 - */ - @Override - protected Executor getTaskExecutor() { - if (taskExecutor == null) { - taskExecutor = Executors.newCachedThreadPool(new EventThreadFactory("rec-event", true)); - } - return taskExecutor; - } - - /** - * 设置任务执行器 - * - * @param taskExecutor taskExecutor - */ - public void setTaskExecutor(Executor taskExecutor) { - this.taskExecutor = taskExecutor; - } - /** * 移除监听器 * @@ -148,7 +125,7 @@ public class DefaultEventDispatcher extends AbstractEventDispatcher { listener.onEvent(baseEvent); } } : baseEventListeners -> { - Executor taskExecutor = getTaskExecutor(); + Executor taskExecutor = getTaskPool(); for (final BaseEventListener listener : baseEventListeners) { taskExecutor.execute(new EventHandler(baseEvent, listener)); } diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java deleted file mode 100644 index cd05019..0000000 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/EventThreadFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.icanci.rec.spi.event; - -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/11 18:01 - */ -public class EventThreadFactory implements ThreadFactory { - - private final AtomicInteger threadNum = new AtomicInteger(1); - - private final String prefix; - - private final boolean daemon; - - private final ThreadGroup group; - - public EventThreadFactory(String prefix, boolean daemon) { - this.prefix = prefix + "-thread-"; - this.daemon = daemon; - SecurityManager s = System.getSecurityManager(); - group = (s == null) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup(); - } - - @Override - public Thread newThread(Runnable runnable) { - String name = prefix + threadNum.getAndIncrement(); - Thread ret = new Thread(group, runnable, name, 0); - ret.setDaemon(daemon); - return ret; - } -} -- Gitee