import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* Thread notifying when it is done running.
*
* @author Thibault Helsmoortel
*/
public abstract class NotifyingThread extends Thread {
private final Set<ThreadCompleteListener> listeners = new CopyOnWriteArraySet<>();
/**
* Adds a listener to this NotifyingThread.
*
* @param listener the listener to add
*/
public final void addListener(final ThreadCompleteListener listener) {
listeners.add(listener);
}
/**
* Removes a listener from this NotifyingThread.
*
* @param listener the listener to remove
*/
public final void removeListener(final ThreadCompleteListener listener) {
listeners.remove(listener);
}
/**
* Notifies registered listeners.
*/
private final void notifyListeners() {
for (ThreadCompleteListener listener : listeners) {
listener.notifyThreadComplete(this);
}
}
@Override
public final void run() {
try {
doRun();
} finally {
//Run complete, notify listeners
notifyListeners();
}
}
/**
* The method to override in stead of the run method.
*/
public abstract void doRun();
}
Comments