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