From c20df9af241a54e3379ed7a84f83cd46927836cc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 Jan 2021 14:26:54 +0300 Subject: [PATCH 1/2] ScheduleManager: move to another package --- src/main/java/ghast/{ => scheduler}/ScheduleManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename src/main/java/ghast/{ => scheduler}/ScheduleManager.java (98%) diff --git a/src/main/java/ghast/ScheduleManager.java b/src/main/java/ghast/scheduler/ScheduleManager.java similarity index 98% rename from src/main/java/ghast/ScheduleManager.java rename to src/main/java/ghast/scheduler/ScheduleManager.java index ee6e073..aa4250d 100644 --- a/src/main/java/ghast/ScheduleManager.java +++ b/src/main/java/ghast/scheduler/ScheduleManager.java @@ -1,6 +1,7 @@ -package ghast; +package ghast.scheduler; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import ghast.GhastTools; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.experimental.UtilityClass; From b3aec1716a39694097a748f60dd88c63a13c6b40 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 Jan 2021 14:38:41 +0300 Subject: [PATCH 2/2] add ScheduleTask --- .../ghast/scheduler/BukkitScheduleTask.java | 20 +++++++++ .../ghast/scheduler/JavaScheduleTask.java | 21 +++++++++ .../java/ghast/scheduler/ScheduleManager.java | 44 +++++++++++++------ .../java/ghast/scheduler/ScheduleTask.java | 8 ++++ 4 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 src/main/java/ghast/scheduler/BukkitScheduleTask.java create mode 100644 src/main/java/ghast/scheduler/JavaScheduleTask.java create mode 100644 src/main/java/ghast/scheduler/ScheduleTask.java diff --git a/src/main/java/ghast/scheduler/BukkitScheduleTask.java b/src/main/java/ghast/scheduler/BukkitScheduleTask.java new file mode 100644 index 0000000..a7349ca --- /dev/null +++ b/src/main/java/ghast/scheduler/BukkitScheduleTask.java @@ -0,0 +1,20 @@ +package ghast.scheduler; + +import lombok.RequiredArgsConstructor; +import org.bukkit.scheduler.BukkitTask; + +@RequiredArgsConstructor +public class BukkitScheduleTask implements ScheduleTask { + + private final BukkitTask bukkitTask; + + @Override + public boolean isCanceled() { + return bukkitTask.isCancelled(); + } + + @Override + public void cancel() { + bukkitTask.cancel(); + } +} diff --git a/src/main/java/ghast/scheduler/JavaScheduleTask.java b/src/main/java/ghast/scheduler/JavaScheduleTask.java new file mode 100644 index 0000000..03ba3ff --- /dev/null +++ b/src/main/java/ghast/scheduler/JavaScheduleTask.java @@ -0,0 +1,21 @@ +package ghast.scheduler; + +import lombok.RequiredArgsConstructor; + +import java.util.concurrent.Future; + +@RequiredArgsConstructor +public class JavaScheduleTask implements ScheduleTask { + + private final Future future; + + @Override + public boolean isCanceled() { + return future.isCancelled(); + } + + @Override + public void cancel() { + future.cancel(true); + } +} diff --git a/src/main/java/ghast/scheduler/ScheduleManager.java b/src/main/java/ghast/scheduler/ScheduleManager.java index aa4250d..75b2c16 100644 --- a/src/main/java/ghast/scheduler/ScheduleManager.java +++ b/src/main/java/ghast/scheduler/ScheduleManager.java @@ -7,6 +7,7 @@ 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.*; @@ -46,48 +47,65 @@ public class ScheduleManager { return this; } - public void execute(Runnable runnable) { + public ScheduleTask execute(Runnable runnable) { if (useBukkitScheduler) { - createBukkitSchedule(runnable); + return createBukkitSchedule(runnable); } else { - createSchedule(runnable); + return createSchedule(runnable); } } - private void createBukkitSchedule(Runnable runnable) { + private ScheduleTask createBukkitSchedule(Runnable runnable) { BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); + BukkitScheduleTask resultTask; if (this.afterMs == null && this.everyMs == null) { - bukkitScheduler.runTask(GhastTools.getPlugin(), runnable); + BukkitTask bukkitTask = bukkitScheduler.runTask(GhastTools.getPlugin(), runnable); + resultTask = new BukkitScheduleTask(bukkitTask); } 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; - bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, everyTicks); + BukkitTask bukkitTask = bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, + everyTicks); + resultTask = new BukkitScheduleTask(bukkitTask); } else { long ticks = this.afterMs / MS_PER_ONE_TICK; - bukkitScheduler.runTaskLater(GhastTools.getPlugin(), runnable, ticks); + BukkitTask bukkitTask = bukkitScheduler.runTaskLater(GhastTools.getPlugin(), runnable, ticks); + resultTask = new BukkitScheduleTask(bukkitTask); } + + return resultTask; } - private void createSchedule(Runnable runnable) { + private ScheduleTask createSchedule(Runnable runnable) { ExecutorService executorService; + JavaScheduleTask resultTask; if (this.afterMs == null && this.everyMs == null) { executorService = Executors.newSingleThreadExecutor(THREAD_FACTORY); - executorService.execute(runnable); + Future future = executorService.submit(runnable); + resultTask = new JavaScheduleTask(future); } else if (this.everyMs != null) { - ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, THREAD_FACTORY); - scheduledExecutorService.scheduleAtFixedRate(runnable, + 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); executorService = scheduledExecutorService; } else { - ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, THREAD_FACTORY); - scheduledExecutorService.schedule(runnable, afterMs, TimeUnit.MILLISECONDS); + ScheduledExecutorService scheduledExecutorService + = Executors.newScheduledThreadPool(1, THREAD_FACTORY); + ScheduledFuture schedule = scheduledExecutorService + .schedule(runnable, afterMs, TimeUnit.MILLISECONDS); + + resultTask = new JavaScheduleTask(schedule); executorService = scheduledExecutorService; } executorService.shutdown(); + return resultTask; } } } diff --git a/src/main/java/ghast/scheduler/ScheduleTask.java b/src/main/java/ghast/scheduler/ScheduleTask.java new file mode 100644 index 0000000..51ef029 --- /dev/null +++ b/src/main/java/ghast/scheduler/ScheduleTask.java @@ -0,0 +1,8 @@ +package ghast.scheduler; + +public interface ScheduleTask { + + boolean isCanceled(); + + void cancel(); +}