Es gibt verschiedene Möglichkeiten, dies zu tun:
- Verwenden Sie Thread.join () in Ihrem Hauptthread, um blockierend auf den Abschluss jedes Threads zu warten, oder
- Überprüfen Sie Thread.isAlive () in einer Abfragemethode - im Allgemeinen nicht empfohlen -, um zu warten, bis jeder Thread abgeschlossen ist, oder
- Unorthodox, rufen Sie für jeden fraglichen Thread setUncaughtExceptionHandler auf, um eine Methode in Ihrem Objekt aufzurufen, und programmieren Sie jeden Thread so, dass er nach Abschluss eine nicht erfasste Ausnahme auslöst , oder
- Verwenden Sie Sperren oder Synchronisierer oder Mechanismen aus java.util.concurrent oder
- Orthodoxer, erstellen Sie einen Listener in Ihrem Haupt-Thread und programmieren Sie dann jeden Ihrer Threads, um dem Listener mitzuteilen, dass sie abgeschlossen sind.
Wie implementiere ich Idee 5? Eine Möglichkeit besteht darin, zuerst eine Schnittstelle zu erstellen:
public interface ThreadCompleteListener {
void notifyOfThreadComplete(final Thread thread);
}
Erstellen Sie dann die folgende Klasse:
public abstract class NotifyingThread extends Thread {
private final Set<ThreadCompleteListener> listeners
= new CopyOnWriteArraySet<ThreadCompleteListener>();
public final void addListener(final ThreadCompleteListener listener) {
listeners.add(listener);
}
public final void removeListener(final ThreadCompleteListener listener) {
listeners.remove(listener);
}
private final void notifyListeners() {
for (ThreadCompleteListener listener : listeners) {
listener.notifyOfThreadComplete(this);
}
}
@Override
public final void run() {
try {
doRun();
} finally {
notifyListeners();
}
}
public abstract void doRun();
}
und dann wird jeder Ihrer Threads erweitert NotifyingThreadund anstatt ihn zu implementieren run(), wird er implementiert doRun(). Wenn sie abgeschlossen sind, benachrichtigen sie automatisch jeden, der auf eine Benachrichtigung wartet.
Schließlich ändern Sie in Ihrer Hauptklasse - der Klasse, die alle Threads startet (oder zumindest das Objekt, das auf eine Benachrichtigung wartet) - diese Klasse implement ThreadCompleteListenerund fügen sich unmittelbar nach dem Erstellen jedes Threads der Liste der Listener hinzu:
NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start(); // Start the Thread
Wenn jeder Thread beendet wird, wird Ihre notifyOfThreadCompleteMethode mit der gerade abgeschlossenen (oder abgestürzten) Thread-Instanz aufgerufen.
Beachten Sie, dass es besser wäre, implements Runnableals extends Threadfür NotifyingThreaddas Erweitern von Threads in neuem Code normalerweise nicht zu empfehlen. Aber ich codiere auf Ihre Frage. Wenn Sie die NotifyingThreadzu implementierende Klasse ändern Runnable, müssen Sie einen Teil Ihres Codes ändern, der Threads verwaltet, was ziemlich einfach ist.