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