From bd91b19114e52d0d8c6f773d150e674f190838e4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 3 Jan 2021 00:22:55 +0300 Subject: [PATCH] =?UTF-8?q?ScheduleManager:=20=D0=BE=D1=82=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghast/scheduler/BukkitScheduleTask.java | 19 ++++++++-- .../ghast/scheduler/JavaScheduleTask.java | 18 +++++++-- .../java/ghast/scheduler/ScheduleManager.java | 38 ++++++++++--------- .../java/ghast/scheduler/ScheduleTask.java | 2 + 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/src/main/java/ghast/scheduler/BukkitScheduleTask.java b/src/main/java/ghast/scheduler/BukkitScheduleTask.java index a7349ca..de4a82b 100644 --- a/src/main/java/ghast/scheduler/BukkitScheduleTask.java +++ b/src/main/java/ghast/scheduler/BukkitScheduleTask.java @@ -3,18 +3,31 @@ package ghast.scheduler; import lombok.RequiredArgsConstructor; import org.bukkit.scheduler.BukkitTask; +import java.util.function.Supplier; + @RequiredArgsConstructor public class BukkitScheduleTask implements ScheduleTask { - private final BukkitTask bukkitTask; + private final Supplier generator; + private BukkitTask bukkitTask; + + @Override + public void start() { + if (isCanceled()) { + bukkitTask = generator.get(); + } + } @Override public boolean isCanceled() { - return bukkitTask.isCancelled(); + return bukkitTask == null || bukkitTask.isCancelled(); } @Override public void cancel() { - bukkitTask.cancel(); + if (bukkitTask != null) { + bukkitTask.cancel(); + bukkitTask = null; + } } } diff --git a/src/main/java/ghast/scheduler/JavaScheduleTask.java b/src/main/java/ghast/scheduler/JavaScheduleTask.java index 03ba3ff..994d21d 100644 --- a/src/main/java/ghast/scheduler/JavaScheduleTask.java +++ b/src/main/java/ghast/scheduler/JavaScheduleTask.java @@ -3,19 +3,31 @@ package ghast.scheduler; import lombok.RequiredArgsConstructor; import java.util.concurrent.Future; +import java.util.function.Supplier; @RequiredArgsConstructor public class JavaScheduleTask implements ScheduleTask { - private final Future future; + private final Supplier> generator; + private Future future; + + @Override + public void start() { + if (future == null || future.isDone()) { + future = generator.get(); + } + } @Override public boolean isCanceled() { - return future.isCancelled(); + return future == null || future.isCancelled(); } @Override public void cancel() { - future.cancel(true); + if (future != null) { + future.cancel(true); + future = null; + } } } diff --git a/src/main/java/ghast/scheduler/ScheduleManager.java b/src/main/java/ghast/scheduler/ScheduleManager.java index 75b2c16..f927259 100644 --- a/src/main/java/ghast/scheduler/ScheduleManager.java +++ b/src/main/java/ghast/scheduler/ScheduleManager.java @@ -7,7 +7,6 @@ import lombok.NoArgsConstructor; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitScheduler; -import org.bukkit.scheduler.BukkitTask; import java.util.concurrent.*; @@ -47,7 +46,7 @@ public class ScheduleManager { return this; } - public ScheduleTask execute(Runnable runnable) { + public ScheduleTask create(Runnable runnable) { if (useBukkitScheduler) { return createBukkitSchedule(runnable); } else { @@ -55,23 +54,27 @@ public class ScheduleManager { } } + public ScheduleTask execute(Runnable runnable) { + ScheduleTask scheduleTask = create(runnable); + scheduleTask.start(); + return scheduleTask; + } + private ScheduleTask createBukkitSchedule(Runnable runnable) { BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); BukkitScheduleTask resultTask; if (this.afterMs == null && this.everyMs == null) { - BukkitTask bukkitTask = bukkitScheduler.runTask(GhastTools.getPlugin(), runnable); - resultTask = new BukkitScheduleTask(bukkitTask); + resultTask = new BukkitScheduleTask(() -> bukkitScheduler.runTask(GhastTools.getPlugin(), runnable)); } else if (this.everyMs != null) { long everyTicks = this.everyMs / MS_PER_ONE_TICK; long afterTicks = this.afterMs != null ? this.afterMs / MS_PER_ONE_TICK : 0; - BukkitTask bukkitTask = bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, - everyTicks); - resultTask = new BukkitScheduleTask(bukkitTask); + resultTask = new BukkitScheduleTask(() -> + bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, everyTicks)); } else { long ticks = this.afterMs / MS_PER_ONE_TICK; - BukkitTask bukkitTask = bukkitScheduler.runTaskLater(GhastTools.getPlugin(), runnable, ticks); - resultTask = new BukkitScheduleTask(bukkitTask); + resultTask = new BukkitScheduleTask(() -> + bukkitScheduler.runTaskLater(GhastTools.getPlugin(), runnable, ticks)); } return resultTask; @@ -83,24 +86,23 @@ public class ScheduleManager { if (this.afterMs == null && this.everyMs == null) { executorService = Executors.newSingleThreadExecutor(THREAD_FACTORY); - Future future = executorService.submit(runnable); - resultTask = new JavaScheduleTask(future); + resultTask = new JavaScheduleTask(() -> executorService.submit(runnable)); } else if (this.everyMs != null) { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, THREAD_FACTORY); - ScheduledFuture scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(runnable, - this.afterMs != null ? this.afterMs : 0, - everyMs, TimeUnit.MILLISECONDS); - resultTask = new JavaScheduleTask(scheduledFuture); + resultTask = new JavaScheduleTask(() -> + scheduledExecutorService.scheduleAtFixedRate(runnable, + this.afterMs != null ? this.afterMs : 0, + everyMs, TimeUnit.MILLISECONDS)); + executorService = scheduledExecutorService; } else { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, THREAD_FACTORY); - ScheduledFuture schedule = scheduledExecutorService - .schedule(runnable, afterMs, TimeUnit.MILLISECONDS); - resultTask = new JavaScheduleTask(schedule); + resultTask = new JavaScheduleTask(() -> + scheduledExecutorService.schedule(runnable, afterMs, TimeUnit.MILLISECONDS)); executorService = scheduledExecutorService; } diff --git a/src/main/java/ghast/scheduler/ScheduleTask.java b/src/main/java/ghast/scheduler/ScheduleTask.java index 51ef029..6a45c28 100644 --- a/src/main/java/ghast/scheduler/ScheduleTask.java +++ b/src/main/java/ghast/scheduler/ScheduleTask.java @@ -2,6 +2,8 @@ package ghast.scheduler; public interface ScheduleTask { + void start(); + boolean isCanceled(); void cancel();