Hay un número de maneras que usted puede hacer esto:
- Uso Thread.join() en su hilo principal que esperar en un modo de bloqueo para cada hilo para completar, o
- Comprobar Thread.isAlive() de una forma de votación - - generalmente desaconsejado - esperar hasta que cada subproceso se haya completado o
- poco ortodoxo, para cada subproceso en cuestión, llame al setUncaughtExceptionHandler para llamar a un método en su objeto, y programe cada subproceso para lanzar una excepción no detectada cuando finalice o
- Use bloqueos o sincronizadores o mecanismos de java.util.concurrent o
- Más ortodoxo, cree un oyente en su Tema principal y luego programe cada uno de sus Subprocesos para decirle al oyente que se han completado.
¿Cómo implementar Idea # 5? Bueno, una forma es crear primero una interfaz:
public interface ThreadCompleteListener {
void notifyOfThreadComplete(final Thread thread);
}
continuación, crear la clase siguiente:
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();
}
y luego cada uno de sus hilos se extenderá NotifyingThread
y en lugar de implementar run()
se pondrá en marcha doRun()
. Por lo tanto, cuando completen, automáticamente notificarán a cualquier persona que esté esperando recibir una notificación.
Finalmente, en su clase principal - la que inicia todos los subprocesos (o al menos el objeto esperando notificación) - modifique esa clase a implement ThreadCompleteListener
e inmediatamente después de crear cada subproceso añádase a la lista de oyentes:
NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start(); // Start the Thread
entonces, a medida que cada hilo termina, su método de notifyOfThreadComplete
se invocará a la instancia de hilo que acaba de terminar (o se haya estrellado).
Tenga en cuenta que sería mejor que implements Runnable
en lugar de extends Thread
para NotifyingThread
, ya que la extensión de subprocesos generalmente no se recomienda en el nuevo código. Pero estoy codificando tu pregunta. Si cambia la clase NotifyingThread
para implementar Runnable
, debe cambiar parte del código que gestiona Threads, lo que es bastante sencillo de hacer.
Tome un vistazo a la de Java 5 [clase Barrera] (http: //java.sun. com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html) – Fortyrunner