package codechicken.nei; public abstract class RestartableTask { public final String name; private Thread thread; private volatile boolean restart; private volatile boolean stopped; private ThreadOperationTimer timer; public RestartableTask(String name) { this.name = name; } private void start() { thread = new Thread(name) { @Override public void run() { do { while (stopped) { try { Thread.sleep(1); } catch (InterruptedException ignored) { } } if (!restart) { execute(); } } while (!finish()); } }; thread.start(); } private synchronized boolean finish() { if (restart) { restart = false; return false; } else { clearTasks(); return true; } } public void clearTasks() { thread = null; timer = null; } public synchronized void restart() { if (thread != null) { stopped = false; restart = true; } else { start(); } } /** * Stops execution until restart is called. If a thread is running, the restart flag will be set, and the thread will be paused once the execute method exits. */ public synchronized void stop() { if (thread != null) { stopped = true; restart = true; } } public boolean interrupted() { return restart; } public synchronized ThreadOperationTimer getTimer(int timeout) { if (timer == null) { timer = ThreadOperationTimer.start(thread, timeout); } return timer; } public abstract void execute(); }