Dalam beberapa skenario, kita harus menunggu eksekusi thread selesai sebelum melanjutkan ke langkah berikutnya. Misalnya, beberapa program perlu menginisialisasi beberapa sumber daya sebelum memulai eksekusi. Saat ini, kita dapat memulai thread secara khusus untuk melakukan tugas inisialisasi, dan menunggu hingga tugas thread selesai sebelum mengeksekusi bagian lainnya.
Untuk tujuan ini, kelas Thread memberi kita metode join(). Saat kita memanggil metode ini menggunakan objek thread, objek thread pemanggil akan ditunda hingga objek yang dipanggil menyelesaikan eksekusi sebelum memulai eksekusi.
Di bagian ini, contoh program menunjukkan menunggu metode inisialisasi selesai sebelum melakukan tugas lainnya.
mengetahuinya
Ikuti langkah-langkah yang ditunjukkan di bawah ini untuk menyelesaikan contoh program.
1. Buat kelas bernama DataSourcesLoader dan implementasikan antarmuka Runnable. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
kelas publik DataSourcesLoader mengimplementasikan Runnable {
2. Terapkan metode run(), cetak pesan ke konsol untuk menunjukkan awal eksekusi, lalu tidur selama 4 detik, lalu cetak pesan ke konsol untuk menunjukkan akhir eksekusi thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
@Mengesampingkan
menjalankan kekosongan publik() {
System.out.printf("Awal pemuatan sumber data: %s/n",
Tanggal baru());
mencoba {
TimeUnit.SECONDS.sleep(4);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Pemuatan sumber data telah selesai: %s/n",
Tanggal baru());
}
3. Buat kelas bernama NetworkConnectionsLoader dan implementasikan antarmuka Runnable. Implementasikan metode run() Kode metode ini sama dengan metode run() kelas DataSourcesLoader, hanya saja metode ini tidak aktif selama 6 detik.
4. Implementasikan kelas utama dari contoh dan implementasikan metode main(). Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
kelas publik Utama {
public static void main(String[] args) {
5. Buat objek DataSourcesLoader dan objek Thread untuk memulai eksekusinya. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
DataSourcesLoader dsLoader = DataSourcesLoader() baru;
Utas thread1 = Utas baru(dsLoader, "DataSourcesLoader");
6. Buat objek NetworkConnectionsLoader dan objek Thread untuk memulai eksekusinya. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
NetworkConnectionsLoader ncLoader = NetworkConnectionsLoader() baru;
Utas thread2 = Utas baru(ncLoader, "NetworkConnectionsLoader");
7. Panggil metode start() dari dua objek Thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
thread1.mulai();
thread2.mulai();
8. Panggil metode join() untuk menunggu kedua thread menyelesaikan tugasnya. Metode ini akan memunculkan InterruptedException, jadi tangkap pengecualian ini. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
mencoba {
thread1.join();
thread2.join();
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
9. Cetak kalimat ke konsol untuk menunjukkan akhir eksekusi program. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
System.out.printf("Utama: Konfigurasi telah dimuat: %s/n",
Tanggal baru());
10. Jalankan program dan periksa efek eksekusi.
tahu kenapa
Saat menjalankan program contoh ini, kita dapat melihat dua thread memulai eksekusinya. Pertama, DataSourcesLoader menyelesaikan eksekusinya; kemudian NetworkConnectionsLoader menyelesaikan eksekusinya. Pada titik ini, thread utama melanjutkan eksekusinya dan kemudian mencetak pesan penghentian ke konsol.
tidak pernah berakhir
Java menyediakan dua metode join() yang kelebihan beban lainnya:
Copy kode kodenya sebagai berikut:
bergabung (milidetik panjang)
bergabung (milidetik panjang, nano panjang)
Metode pertama tidak menunggu sampai dipanggil untuk menyelesaikan tugas, tetapi menunggu waktu yang ditentukan oleh parameter sebelum memulai eksekusi, misalnya jika thread1 memanggil metode ini, thread1.join(1000), ketika thread thread1 bertemu dengan salah satu dari mereka. kondisi berikut akan terus dijalankan:
1.thread2 menyelesaikan eksekusinya;
2.Setelah 1000 milidetik;
Ketika salah satu dari dua kondisi ini benar, metode join() akan kembali dan terus menjalankan tugas awal.
Metode kedua sangat mirip dengan metode pertama, hanya saja metode ini memiliki parameter waktu nanodetik tambahan.
Gunakan doktrin
Artikel ini diterjemahkan dari "Buku Masak Konkurensi Java 7" (D Gua Ge mencurinya sebagai "Koleksi Contoh Konkurensi Java7") dan hanya digunakan sebagai bahan pembelajaran. Ini tidak boleh digunakan untuk tujuan komersial apa pun tanpa izin.
Keberhasilan kecil
Versi lengkap dari kode contoh yang digunakan di bagian ini.
Kode lengkap class DataSourcesLoader adalah sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
import java.util.bersamaan.TimeUnit;
/**
* Tanggal: 19-09-2013
* Waktu: 09:15
*/
kelas publik DataSourcesLoader mengimplementasikan Runnable {
@Mengesampingkan
menjalankan kekosongan publik() {
System.out.printf("Awal pemuatan sumber data: %s/n",
Tanggal baru());
mencoba {
TimeUnit.SECONDS.sleep(4);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Pemuatan sumber data telah selesai: %s/n",
Tanggal baru());
}
}
Kode lengkap kelas NetworkConnectionsLoader
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
import java.util.bersamaan.TimeUnit;
/**
* Tanggal: 19-09-2013
* Waktu: 09:21
*/
NetworkConnectionsLoader kelas publik mengimplementasikan Runnable {
@Mengesampingkan
menjalankan kekosongan publik() {
System.out.printf("Awal pemuatan sumber data: %s/n",
Tanggal baru());
mencoba {
TimeUnit.SECONDS.sleep(6);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Pemuatan sumber data telah selesai: %s/n",
Tanggal baru());
}
}
Kode lengkap kelas Utama
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
/**
* Tanggal: 19-09-2013
* Waktu: 09:25
*/
kelas publik Utama {
public static void main(String[] args) {
DataSourcesLoader dsLoader = DataSourcesLoader() baru;
Utas thread1 = Utas baru(dsLoader, "DataSourcesLoader");
NetworkConnectionsLoader ncLoader = NetworkConnectionsLoader() baru;
Utas thread2 = Utas baru(ncLoader, "NetworkConnectionsLoader");
thread1.mulai();
thread2.mulai();
mencoba {
thread1.join();
thread2.join();
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Utama: Konfigurasi telah dimuat: %s/n",
Tanggal baru());
}
}