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 NotifyingThread
dan 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 ThreadCompleteListener
dan 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, notifyOfThreadComplete
metode Anda akan dipanggil dengan instance Thread yang baru saja selesai (atau macet).
Perhatikan bahwa lebih baik implements Runnable
daripada daripada extends Thread
karena NotifyingThread
memperluas Thread biasanya tidak disarankan dalam kode baru. Tapi saya mengkode pertanyaan Anda. Jika Anda mengubah NotifyingThread
kelas untuk diimplementasikan Runnable
maka Anda harus mengubah beberapa kode Anda yang mengelola Thread, yang cukup mudah dilakukan.