From 78bb39e4c724b5d4cc049dd18069e914bde33deb Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sun, 29 Jun 2025 21:56:15 +0300 Subject: [PATCH] ActionThread --- .../npcs/controllers/data/action/Action.java | 2 +- .../npcs/controllers/data/action/ActionThread.java | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/noppes/npcs/controllers/data/action/Action.java b/src/main/java/noppes/npcs/controllers/data/action/Action.java index 770487714..4a83ab0a8 100644 --- a/src/main/java/noppes/npcs/controllers/data/action/Action.java +++ b/src/main/java/noppes/npcs/controllers/data/action/Action.java @@ -73,7 +73,7 @@ public class Action implements IAction { } if (ticksExisted % updateEveryXTick == 0 && task != null) { if (isThreaded) - actionThread.execute(this::executeTask); + actionThread.execute("task", this::executeTask); else executeTask(); } diff --git a/src/main/java/noppes/npcs/controllers/data/action/ActionThread.java b/src/main/java/noppes/npcs/controllers/data/action/ActionThread.java index 8c381aa4d..9c0d29fd4 100644 --- a/src/main/java/noppes/npcs/controllers/data/action/ActionThread.java +++ b/src/main/java/noppes/npcs/controllers/data/action/ActionThread.java @@ -1,10 +1,8 @@ package noppes.npcs.controllers.data.action; import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; +import java.util.Set; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; @@ -12,7 +10,9 @@ public class ActionThread { private final Object lock = new Object(); private Thread thread; ExecutorService executor; + private final Queue> runningTasks = new ConcurrentLinkedQueue<>(); + private final Set runningKeys = ConcurrentHashMap.newKeySet(); private volatile boolean threadPaused, threadSleeping; @@ -98,20 +98,22 @@ public class ActionThread { return runningTasks.stream().anyMatch(task -> !task.isDone()); } - protected void execute(Runnable task) { + protected void execute(String taskKey, Runnable task) { if (threadPaused && pauseUntil != null && pauseUntil.get()) resume(); - if (isThreadRunning()) + if (runningKeys.contains(taskKey)) return; final AtomicReference> taskRef = new AtomicReference<>(); taskRef.set(executor.submit(() -> { runningTasks.add(taskRef.get()); + runningKeys.add(taskKey); try { task.run(); } finally { runningTasks.remove(taskRef.get()); + runningKeys.remove(taskKey); } })); }