0

Merge branch 'feature/scheduler' into develop

This commit is contained in:
2021-01-03 00:23:17 +03:00
4 changed files with 53 additions and 24 deletions

View File

@@ -3,18 +3,31 @@ package ghast.scheduler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.util.function.Supplier;
@RequiredArgsConstructor @RequiredArgsConstructor
public class BukkitScheduleTask implements ScheduleTask { public class BukkitScheduleTask implements ScheduleTask {
private final BukkitTask bukkitTask; private final Supplier<BukkitTask> generator;
private BukkitTask bukkitTask;
@Override
public void start() {
if (isCanceled()) {
bukkitTask = generator.get();
}
}
@Override @Override
public boolean isCanceled() { public boolean isCanceled() {
return bukkitTask.isCancelled(); return bukkitTask == null || bukkitTask.isCancelled();
} }
@Override @Override
public void cancel() { public void cancel() {
if (bukkitTask != null) {
bukkitTask.cancel(); bukkitTask.cancel();
bukkitTask = null;
}
} }
} }

View File

@@ -3,19 +3,31 @@ package ghast.scheduler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.function.Supplier;
@RequiredArgsConstructor @RequiredArgsConstructor
public class JavaScheduleTask implements ScheduleTask { public class JavaScheduleTask implements ScheduleTask {
private final Future<?> future; private final Supplier<Future<?>> generator;
private Future<?> future;
@Override
public void start() {
if (future == null || future.isDone()) {
future = generator.get();
}
}
@Override @Override
public boolean isCanceled() { public boolean isCanceled() {
return future.isCancelled(); return future == null || future.isCancelled();
} }
@Override @Override
public void cancel() { public void cancel() {
if (future != null) {
future.cancel(true); future.cancel(true);
future = null;
}
} }
} }

View File

@@ -7,7 +7,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.util.concurrent.*; import java.util.concurrent.*;
@@ -47,7 +46,7 @@ public class ScheduleManager {
return this; return this;
} }
public ScheduleTask execute(Runnable runnable) { public ScheduleTask create(Runnable runnable) {
if (useBukkitScheduler) { if (useBukkitScheduler) {
return createBukkitSchedule(runnable); return createBukkitSchedule(runnable);
} else { } 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) { private ScheduleTask createBukkitSchedule(Runnable runnable) {
BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); BukkitScheduler bukkitScheduler = Bukkit.getScheduler();
BukkitScheduleTask resultTask; BukkitScheduleTask resultTask;
if (this.afterMs == null && this.everyMs == null) { if (this.afterMs == null && this.everyMs == null) {
BukkitTask bukkitTask = bukkitScheduler.runTask(GhastTools.getPlugin(), runnable); resultTask = new BukkitScheduleTask(() -> bukkitScheduler.runTask(GhastTools.getPlugin(), runnable));
resultTask = new BukkitScheduleTask(bukkitTask);
} else if (this.everyMs != null) { } else if (this.everyMs != null) {
long everyTicks = this.everyMs / MS_PER_ONE_TICK; long everyTicks = this.everyMs / MS_PER_ONE_TICK;
long afterTicks = this.afterMs != null ? this.afterMs / MS_PER_ONE_TICK : 0; long afterTicks = this.afterMs != null ? this.afterMs / MS_PER_ONE_TICK : 0;
BukkitTask bukkitTask = bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, resultTask = new BukkitScheduleTask(() ->
everyTicks); bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, everyTicks));
resultTask = new BukkitScheduleTask(bukkitTask);
} else { } else {
long ticks = this.afterMs / MS_PER_ONE_TICK; long ticks = this.afterMs / MS_PER_ONE_TICK;
BukkitTask bukkitTask = bukkitScheduler.runTaskLater(GhastTools.getPlugin(), runnable, ticks); resultTask = new BukkitScheduleTask(() ->
resultTask = new BukkitScheduleTask(bukkitTask); bukkitScheduler.runTaskLater(GhastTools.getPlugin(), runnable, ticks));
} }
return resultTask; return resultTask;
@@ -83,24 +86,23 @@ public class ScheduleManager {
if (this.afterMs == null && this.everyMs == null) { if (this.afterMs == null && this.everyMs == null) {
executorService = Executors.newSingleThreadExecutor(THREAD_FACTORY); executorService = Executors.newSingleThreadExecutor(THREAD_FACTORY);
Future<?> future = executorService.submit(runnable); resultTask = new JavaScheduleTask(() -> executorService.submit(runnable));
resultTask = new JavaScheduleTask(future);
} else if (this.everyMs != null) { } else if (this.everyMs != null) {
ScheduledExecutorService scheduledExecutorService ScheduledExecutorService scheduledExecutorService
= Executors.newScheduledThreadPool(1, THREAD_FACTORY); = 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; executorService = scheduledExecutorService;
} else { } else {
ScheduledExecutorService scheduledExecutorService ScheduledExecutorService scheduledExecutorService
= Executors.newScheduledThreadPool(1, THREAD_FACTORY); = 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; executorService = scheduledExecutorService;
} }

View File

@@ -2,6 +2,8 @@ package ghast.scheduler;
public interface ScheduleTask { public interface ScheduleTask {
void start();
boolean isCanceled(); boolean isCanceled();
void cancel(); void cancel();