Ada beberapa cara Anda dapat melakukan ini:
- Gunakan Thread.join () di utas utama Anda untuk menunggu dengan cara memblokir untuk setiap Thread untuk menyelesaikan, atau
- Periksa Thread.isAlive () dengan cara polling - umumnya tidak disarankan - untuk menunggu sampai setiap Thread selesai, atau
- Unorthodox, untuk setiap Thread yang dipermasalahkan, panggil setUncaughtExceptionHandler untuk memanggil metode di objek Anda, dan program setiap Thread untuk melemparkan Pengecualian yang tidak tertangkap saat selesai, atau
- Gunakan kunci atau sinkronisasi atau mekanisme dari java.util.concurrent , atau
- Lebih ortodoks, buat pendengar di utas utama Anda, dan kemudian program masing-masing utas Anda untuk memberi tahu pendengar bahwa mereka telah selesai.
Bagaimana cara menerapkan Ide # 5? Nah, salah satu caranya adalah pertama-tama membuat antarmuka:
public interface ThreadCompleteListener {
void notifyOfThreadComplete(final Thread thread);
}
lalu buat kelas berikut:
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();
}
dan kemudian masing-masing Thread Anda akan diperluas NotifyingThreaddan alih-alih mengimplementasikannya run()akan menerapkan doRun(). Jadi ketika mereka selesai, mereka akan secara otomatis memberi tahu siapa pun yang menunggu pemberitahuan.
Terakhir, di kelas utama Anda - kelas yang memulai semua Thread (atau setidaknya objek yang menunggu pemberitahuan) - modifikasi kelas itu implement ThreadCompleteListenerdan segera setelah membuat setiap Thread, tambahkan sendiri ke daftar pendengar:
NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start(); // Start the Thread
kemudian, saat setiap Thread keluar, notifyOfThreadCompletemetode Anda akan dipanggil dengan instance Thread yang baru saja selesai (atau macet).
Perhatikan bahwa lebih baik implements Runnabledaripada daripada extends Threadkarena NotifyingThreadmemperluas Thread biasanya tidak disarankan dalam kode baru. Tapi saya mengkode pertanyaan Anda. Jika Anda mengubah NotifyingThreadkelas untuk diimplementasikan Runnablemaka Anda harus mengubah beberapa kode Anda yang mengelola Thread, yang cukup mudah dilakukan.