package thaw.core;
import java.util.Vector;
import java.util.Iterator;
public class ThawThread extends Thread {
private static ThreadGroup threadGroup = new ThreadGroup("Thaw");
private static Vector threads = new Vector();
private static boolean allowFullStop = false;
private Object parent;
private ThawRunnable target;
private String name;
public ThawThread(ThawRunnable target, String name) {
this(target, name, null);
}
public ThawThread(ThawRunnable target, String name, Object parent) {
super(threadGroup, name);
this.target = target;
this.name = name;
this.parent = parent;
}
public void run() {
Logger.info(this, "Starting thread '"+name+"' ...");
synchronized(threads) {
threads.add(this);
}
target.run();
synchronized(threads) {
threads.remove(this);
}
Logger.info(this, "Thread '"+name+"' finished");
if (threads.size() == 0) {
Logger.notice(this, "All Thaw threads are stopped");
}
}
public ThawRunnable getTarget() {
return target;
}
public Object getParent() {
return parent;
}
public static void setAllowFullStop(boolean a) {
allowFullStop = a;
synchronized(threads) {
if (allowFullStop) {
if (threads.size() == 0) {
Logger.notice(null, "All Thaw threads are stopped.");
}
}
}
}
public static void listThreads() {
synchronized(threads) {
Logger.info(null,
Integer.toString(threadGroup.activeCount())+" threads "+
"("+Integer.toString(threads.size())+" known)");
for (Iterator it = threads.iterator();
it.hasNext();) {
ThawThread th = (ThawThread)it.next();
if (th != null) {
if (th.getParent() != null) {
Logger.info(null,
"'"+th.getName()+"' "+
"(parent: '"+th.getParent().getClass().getName()+"')");
} else {
Logger.info(null,
"'"+th.getName()+"' "+
"(parent: unknown)");
}
}
}
}
}
public static void stopAll() {
synchronized(threads) {
for (Iterator it = threads.iterator();
it.hasNext();) {
ThawThread th = (ThawThread)it.next();
th.getTarget().stop();
}
}
}
}