Merge branch 'feature/scheduler' into develop
This commit is contained in:
@@ -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<BukkitTask> 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() {
|
||||
if (bukkitTask != null) {
|
||||
bukkitTask.cancel();
|
||||
bukkitTask = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Future<?>> 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() {
|
||||
if (future != null) {
|
||||
future.cancel(true);
|
||||
future = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ package ghast.scheduler;
|
||||
|
||||
public interface ScheduleTask {
|
||||
|
||||
void start();
|
||||
|
||||
boolean isCanceled();
|
||||
|
||||
void cancel();
|
||||
|
||||
Reference in New Issue
Block a user