package net.CyanWool.scheduler; import java.util.HashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import net.CyanWool.api.CyanWool; import net.CyanWool.api.Server; import net.CyanWool.api.scheduler.Scheduler; import net.CyanWool.api.scheduler.Task; public final class CyanScheduler implements Scheduler { private final HashMap<Integer, Task> tasks = new HashMap<Integer, Task>(); private ScheduledExecutorService es; private int id; private Server server; public CyanScheduler(Server server) { this.setServer(server); } @Override public Task runTaskRepeat(Runnable r, long startAfter, long delay) { long afterTicks = startAfter * 50; long ticks = delay * 50; ScheduledFuture<?> sch = getService().scheduleWithFixedDelay(r, afterTicks, ticks, TimeUnit.MILLISECONDS); Task task = new Task(id, sch); tasks.put(id, task); id++; return task; } @Override public Task runTask(Runnable r, long delay) { long ticks = delay * 50; ScheduledFuture<?> sch = getService().schedule(r, ticks, TimeUnit.MILLISECONDS); Task task = new Task(id, sch); tasks.put(id, task); id++; return task; } @Override public Task getTask(int id) { return tasks.get(id); } @Override public boolean cancelTask(int id) { if (getTask(id) != null) { return getTask(id).cancel(false); } return false; } @Override public void cancelAllTasks() { for (Task task : tasks.values()) { task.getScheduledFuture().cancel(false); } tasks.clear(); try { getService().awaitTermination(2, TimeUnit.SECONDS); } catch (InterruptedException ex) { CyanWool.getLogger().error("Error halting scheduler service", ex); } } public ScheduledExecutorService getService() { if (es == null || es.isShutdown()) { es = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()); } return es; } /** * @return the server */ @Override public Server getServer() { return server; } /** * @param server * the server to set */ public void setServer(Server server) { this.server = server; } @Override public void shutdown() { cancelAllTasks(); getService().shutdownNow(); } @Override public int getLastId() { // TODO Auto-generated method stub return 0; } }