Il y a un certain nombre de façons dont vous pouvez faire ceci:
- L'Utilisation De Threads.join() dans votre thread principal à attendre dans un blocage de la mode pour chaque Thread au complet, ou
- Vérifier Le Fil De Discussion.isAlive() dans un mode d'interrogation -- généralement déconseillée -- attendre jusqu'à ce que chaque Thread est terminé, ou
- Peu orthodoxes, pour chaque Thread en question, appelez setUncaughtExceptionHandler pour appeler une méthode de l'objet et du programme de chaque Thread pour lancer une Exception non interceptée lorsqu'elle est terminée, ou
- Utiliser des verrous ou des synchroniseurs ou des mécanismes de java.util.simultanées, ou
- Plus orthodoxe, de créer un écouteur dans votre Thread principal, puis le programme de chacun de vos Fils pour dire à l'auditeur qu'ils ont terminé.
Comment mettre en œuvre l'Idée #5? Eh bien, une façon est d'abord de créer une interface:
public interface ThreadCompleteListener {
void notifyOfThreadComplete(final Thread thread);
}
puis créez la classe suivante:
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();
}
et puis chacun de vos Fils va étendre NotifyingThread
et au lieu de la mise en œuvre de run()
il va mettre en oeuvre doRun()
. Ainsi, lorsqu'ils ont terminé, ils seront automatiquement notifier à toute personne en attente de la notification.
Enfin, dans votre classe principale -- celui qui commence tous les Threads (ou au moins l'objet en attente de notification) -- modifier la classe d' implement ThreadCompleteListener
et immédiatement après la création de chaque Thread s'ajouter à la liste des auditeurs:
NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start(); // Start the Thread
puis, comme chaque Thread s'arrête, votre notifyOfThreadComplete
méthode sera invoquée avec le Fil de l'instance qui vient de se terminer (ou écrasé).
Notez que le mieux serait d' implements Runnable
plutôt que d' extends Thread
pour NotifyingThread
comme l'extension de Fil est généralement déconseillé dans le nouveau code. Mais je suis de codage à votre question. Si vous modifiez l' NotifyingThread
classe pour implémenter Runnable
, alors vous devez changer certaines de vos code qui gère les Threads, ce qui est assez simple à faire.