Repository for lakemenbane
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
3.7 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.core;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
/**
*
*/
public abstract class ControlledRunnable implements Runnable {
protected boolean runCmd = false;
protected boolean runStatus = false;
private Thread thisThread;
private final String threadName;
public ControlledRunnable(String threadName) {
super();
this.threadName = threadName;
ControlledRunnable.runnables.add(this);
}
/*
* Main loop
*/
/**
* This is the method called when ControlledRunnable.thisThread.start() is
* called.
*/
@Override
public void run() {
if (this._preRun() == false) {
return;
}
this.runStatus = true;
if (this._Run() == false) {
return;
}
if (this._postRun() == false) {
return;
}
this.runStatus = false;
}
/**
* _preRun() is called prior to the call to _Run(), but after _startup()
*
* @return
*/
protected abstract boolean _preRun();
/**
* _Run() is called after _startup() and contains should contain the main
* loop.
*
* @return
*/
protected abstract boolean _Run();
/**
* _postRun() is called after _Run() exits, not necessarily before
* _shutdown()
*
* @return
*/
protected abstract boolean _postRun();
/*
* Control
*/
/**
* startup() initializes the internal thread, sets the runCMD to true, and
* calls _startup() prior to starting of the internal Thread.
*/
public void startup() {
this.thisThread = new Thread(this, this.threadName);
this.runCmd = true;
this._startup();
this.thisThread.start();
}
/**
* This method is called just before ControlledRunnable.thisThread.start()
* is called.
*/
protected abstract void _startup();
/**
* This method is called to request a shutdown of the runnable.
*/
public void shutdown() {
this.runCmd = false;
this._shutdown();
}
/**
* This method is called just after ControlledRunnable.runCmd is set to
* False.
*/
protected abstract void _shutdown();
/*
* Getters n setters
*/
public boolean getRunCmd() {
return runCmd;
}
public boolean getRunStatus() {
return runStatus;
}
/*
* Blockers
*/
public void blockTillRunStatus(boolean status) {
while (this.runStatus != status) {
try {
System.out.println("BLOCKING");
Thread.sleep(25L);
} catch (InterruptedException e) {
Logger.debug( e.getMessage());
break;
}
}
}
/**
* @return the thisThread
*/
protected Thread getThisThread() {
return thisThread;
}
/**
* @return the threadName
*/
public String getThreadName() {
return threadName;
}
/*
* Instance monitoring and tools
*/
// Runnable tracking
private static final ArrayList<ControlledRunnable> runnables = new ArrayList<>();
public static void shutdownAllRunnables() {
for (ControlledRunnable cr : ControlledRunnable.runnables) {
//Use Direct logging since JobManager is a runnable.
Logger.info("ControlledRunnable",
"Sending Shutdown cmd to: " + cr.threadName);
cr.shutdown();
}
}
}