From a524ba85060911301d5b51427bd6995ebc30da57 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 1 Feb 2026 16:09:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86=20EventManager=20(#5381)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/event/EventManager.java | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java index 952b3673e..fa3f8fc3f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java @@ -17,31 +17,31 @@ */ package org.jackhuang.hmcl.event; -import org.jackhuang.hmcl.util.SimpleMultimap; import org.jetbrains.annotations.Contract; import java.lang.ref.WeakReference; -import java.util.EnumMap; -import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; /// @author huangyuhui public final class EventManager { + private static final int PRIORITY_COUNT = EventPriority.values().length; + private final ReentrantLock lock = new ReentrantLock(); - private final SimpleMultimap, CopyOnWriteArraySet>> handlers - = new SimpleMultimap<>(() -> new EnumMap<>(EventPriority.class), CopyOnWriteArraySet::new); + @SuppressWarnings("unchecked") + private final CopyOnWriteArrayList>[] allHandlers = (CopyOnWriteArrayList>[]) new CopyOnWriteArrayList[PRIORITY_COUNT]; @Contract("_ -> param1") public Consumer registerWeak(Consumer consumer) { - register(new WeakListener(consumer)); + register(new WeakListener<>(new WeakReference<>(consumer))); return consumer; } @Contract("_, _ -> param1") public Consumer registerWeak(Consumer consumer, EventPriority priority) { - register(new WeakListener(consumer), priority); + register(new WeakListener<>(new WeakReference<>(consumer)), priority); return consumer; } @@ -52,7 +52,12 @@ public final class EventManager { public void register(Consumer consumer, EventPriority priority) { lock.lock(); try { - handlers.get(priority).add(consumer); + var handlers = allHandlers[priority.ordinal()]; + if (handlers == null) { + handlers = new CopyOnWriteArrayList<>(); + allHandlers[priority.ordinal()] = handlers; + } + handlers.add(consumer); } finally { lock.unlock(); } @@ -69,9 +74,21 @@ public final class EventManager { public Event.Result fireEvent(T event) { lock.lock(); try { - for (EventPriority priority : EventPriority.values()) { - for (Consumer handler : handlers.get(priority)) - handler.accept(event); + for (var handlers : allHandlers) { + if (handlers != null) { + for (Consumer handler : handlers) { + if (handler instanceof WeakListener weakListener) { + Consumer consumer = weakListener.ref.get(); + if (consumer != null) { + consumer.accept(event); + } else { + handlers.remove(weakListener); + } + } else { + handler.accept(event); + } + } + } } } finally { lock.unlock(); @@ -80,30 +97,12 @@ public final class EventManager { return event.hasResult() ? event.getResult() : Event.Result.DEFAULT; } - public void unregister(Consumer consumer) { - lock.lock(); - try { - handlers.removeValue(consumer); - } finally { - lock.unlock(); - } - } - - private final class WeakListener implements Consumer { - private final WeakReference> ref; - - public WeakListener(Consumer listener) { - this.ref = new WeakReference<>(listener); - } - + private record WeakListener(WeakReference> ref) implements Consumer { @Override public void accept(T t) { Consumer listener = ref.get(); - if (listener == null) { - unregister(this); - } else { + if (listener != null) listener.accept(t); - } } } }