0

5 Commits
v1.7 ... v1.8

Author SHA1 Message Date
e12d005a25 update version 2021-01-02 14:39:35 +03:00
6e50fc278e Merge branch 'develop' 2021-01-02 14:39:18 +03:00
5f2e208453 Merge branch 'feature/scheduler' into develop 2021-01-02 14:39:05 +03:00
b3aec1716a add ScheduleTask 2021-01-02 14:38:41 +03:00
c20df9af24 ScheduleManager: move to another package 2021-01-02 14:26:54 +03:00
5 changed files with 83 additions and 15 deletions

View File

@@ -1,3 +1,3 @@
projectGroup=ghast projectGroup=ghast
projectName=ghast-tools projectName=ghast-tools
projectVersion=1.7 projectVersion=1.8

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -1,11 +1,13 @@
package ghast; package ghast.scheduler;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import ghast.GhastTools;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; 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.*;
@@ -45,48 +47,65 @@ public class ScheduleManager {
return this; return this;
} }
public void execute(Runnable runnable) { public ScheduleTask execute(Runnable runnable) {
if (useBukkitScheduler) { if (useBukkitScheduler) {
createBukkitSchedule(runnable); return createBukkitSchedule(runnable);
} else { } else {
createSchedule(runnable); return createSchedule(runnable);
} }
} }
private void createBukkitSchedule(Runnable runnable) { private ScheduleTask createBukkitSchedule(Runnable runnable) {
BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); BukkitScheduler bukkitScheduler = Bukkit.getScheduler();
BukkitScheduleTask resultTask;
if (this.afterMs == null && this.everyMs == null) { 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) { } 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;
bukkitScheduler.runTaskTimer(GhastTools.getPlugin(), runnable, afterTicks, everyTicks); BukkitTask bukkitTask = 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;
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; ExecutorService executorService;
JavaScheduleTask resultTask;
if (this.afterMs == null && this.everyMs == null) { if (this.afterMs == null && this.everyMs == null) {
executorService = Executors.newSingleThreadExecutor(THREAD_FACTORY); executorService = Executors.newSingleThreadExecutor(THREAD_FACTORY);
executorService.execute(runnable); Future<?> future = executorService.submit(runnable);
resultTask = new JavaScheduleTask(future);
} else if (this.everyMs != null) { } else if (this.everyMs != null) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, THREAD_FACTORY); ScheduledExecutorService scheduledExecutorService
scheduledExecutorService.scheduleAtFixedRate(runnable, = Executors.newScheduledThreadPool(1, THREAD_FACTORY);
ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(runnable,
this.afterMs != null ? this.afterMs : 0, this.afterMs != null ? this.afterMs : 0,
everyMs, TimeUnit.MILLISECONDS); everyMs, TimeUnit.MILLISECONDS);
resultTask = new JavaScheduleTask(scheduledFuture);
executorService = scheduledExecutorService; executorService = scheduledExecutorService;
} else { } else {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, THREAD_FACTORY); ScheduledExecutorService scheduledExecutorService
scheduledExecutorService.schedule(runnable, afterMs, TimeUnit.MILLISECONDS); = Executors.newScheduledThreadPool(1, THREAD_FACTORY);
ScheduledFuture<?> schedule = scheduledExecutorService
.schedule(runnable, afterMs, TimeUnit.MILLISECONDS);
resultTask = new JavaScheduleTask(schedule);
executorService = scheduledExecutorService; executorService = scheduledExecutorService;
} }
executorService.shutdown(); executorService.shutdown();
return resultTask;
} }
} }
} }

View File

@@ -0,0 +1,8 @@
package ghast.scheduler;
public interface ScheduleTask {
boolean isCanceled();
void cancel();
}