diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/backend/RenderTaskQueue.java b/src/main/java/ru/windcorp/progressia/client/graphics/backend/RenderTaskQueue.java index e49934c..190f128 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/backend/RenderTaskQueue.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/backend/RenderTaskQueue.java @@ -24,6 +24,14 @@ public class RenderTaskQueue { private static final TaskQueue HANDLER = new TaskQueue(GraphicsInterface::isRenderThread); + + public static void schedule(Runnable task) { + HANDLER.schedule(task); + } + + public static void removeScheduled(Runnable task) { + HANDLER.removeScheduled(task); + } public static void invokeLater(Runnable task) { HANDLER.invokeLater(task); diff --git a/src/main/java/ru/windcorp/progressia/common/util/TaskQueue.java b/src/main/java/ru/windcorp/progressia/common/util/TaskQueue.java index 62d208b..b6d030c 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/TaskQueue.java +++ b/src/main/java/ru/windcorp/progressia/common/util/TaskQueue.java @@ -17,6 +17,7 @@ *******************************************************************************/ package ru.windcorp.progressia.common.util; +import java.util.Collection; import java.util.Iterator; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -29,11 +30,21 @@ import ru.windcorp.jputil.functions.ThrowingRunnable; public class TaskQueue { private final Queue queue = new ConcurrentLinkedQueue<>(); + private final Collection repeating = new ConcurrentLinkedQueue<>(); + private final BooleanSupplier runNow; public TaskQueue(BooleanSupplier runNow) { this.runNow = runNow; } + + public void schedule(Runnable task) { + repeating.add(task); + } + + public void removeScheduled(Runnable task) { + repeating.remove(task); + } public void invokeLater(Runnable task) { queue.add(task); @@ -106,6 +117,10 @@ public class TaskQueue { tasks.next().run(); tasks.remove(); } + + for (Runnable task : repeating) { + task.run(); + } } } diff --git a/src/main/java/ru/windcorp/progressia/server/Server.java b/src/main/java/ru/windcorp/progressia/server/Server.java index 4a5352c..ca99589 100644 --- a/src/main/java/ru/windcorp/progressia/server/Server.java +++ b/src/main/java/ru/windcorp/progressia/server/Server.java @@ -1,8 +1,5 @@ package ru.windcorp.progressia.server; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.function.Consumer; import org.apache.logging.log4j.LogManager; @@ -34,7 +31,6 @@ public class Server { private final ClientManager clientManager = new ClientManager(this); private final TaskQueue taskQueue = new TaskQueue(this::isServerThread); - private final Collection> repeatingTasks = Collections.synchronizedCollection(new ArrayList<>()); private final TickingSettings tickingSettings = new TickingSettings(); @@ -42,7 +38,7 @@ public class Server { this.world = new WorldLogic(world, this); this.serverThread = new ServerThread(this); - invokeEveryTick(this::scheduleChunkTicks); + schedule(this::scheduleChunkTicks); } /** @@ -80,7 +76,7 @@ public class Server { * * @param task the task to run * @see #invokeNow(Runnable) - * @see #invokeEveryTick(Consumer) + * @see #schedule(Consumer) */ public void invokeLater(Runnable task) { taskQueue.invokeLater(task); @@ -98,7 +94,7 @@ public class Server { * * @param task the task to run * @see #invokeLater(Runnable) - * @see #invokeEveryTick(Consumer) + * @see #schedule(Consumer) */ public void invokeNow(Runnable task) { taskQueue.invokeNow(task); @@ -110,8 +106,8 @@ public class Server { taskQueue.waitAndInvoke(task); } - public void invokeEveryTick(Consumer task) { - repeatingTasks.add(task); + public void schedule(Consumer task) { + taskQueue.schedule(() -> task.accept(this)); } public void requestChange(Change change) { @@ -161,7 +157,6 @@ public class Server { */ public void tick() { taskQueue.runTasks(); - repeatingTasks.forEach(t -> t.accept(this)); } /**