Есть несколько способов, вы можете сделать это:
- Использование Thread.join() в основном потоке ждать в блокирующей моде для каждой тему, чтобы закончить, или
- Проверить Thread.isAlive() в избирательной моде - - обычно не рекомендуется - дождаться завершения каждой нити или
- Unorthodox, для каждой интересующей темы, позвоните по телефону setUncaughtExceptionHandler, чтобы вызвать метод в вашем объекте и запрограммировать каждую нить, чтобы бросить неперехваченное исключение, когда оно завершено, или
- Используйте замки или синхронизаторы или механизмы от java.util.concurrent, или
- Более ортодоксальные, создайте слушателя в главной теме, а затем запрограммируйте каждую из ваших потоков, чтобы сообщить слушателю, что они были выполнены.
Как реализовать идею №5? Ну, один из способов является первым создать интерфейс:
public interface ThreadCompleteListener {
void notifyOfThreadComplete(final Thread thread);
}
создайте следующий класс:
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();
}
, а затем каждый из ваших Threads продлит NotifyingThread
и вместо реализации run()
будет осуществлять doRun()
. Таким образом, когда они завершатся, они автоматически уведомляют кого-либо, ожидающего уведомления.
Наконец, в вашем основном классе - тот, который запускает все потоки (или, по крайней мере, объект, ожидающий уведомления) - измените этот класс на implement ThreadCompleteListener
и сразу после создания каждой темы добавьте себя в список слушателей:
NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start(); // Start the Thread
то, как каждый выходит темы, ваш метод notifyOfThreadComplete
будет вызван с экземпляром Thread, который только что закончил (или разбитого).
Отметьте, что лучше было бы implements Runnable
, а не extends Thread
для NotifyingThread
как продолжение Тема обычно обескуражена в новом коде. Но я кодирую ваш вопрос. Если вы изменили класс NotifyingThread
для реализации Runnable
, вам необходимо изменить часть своего кода, который управляет Threads, что довольно просто сделать.
Посмотрите на Java 5 [Барьер класс] (Http: //java.sun. com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html) – Fortyrunner