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