Isi yang terlibat dalam bab ini meliputi:
1. JOW () PENDAHULUAN
2. Analisis Kode Sumber Bergabung () (berdasarkan JDK1.7.0_40)
3. JOW () Contoh
1. JOW () PENDAHULUAN
gabungan () didefinisikan dalam thread.java.
Peran bergabung (): Biarkan "utas utama" menunggu "utas anak" berakhir sebelum terus berjalan. Kalimat ini mungkin agak tidak jelas, tetapi kita harus memahaminya melalui contoh:
Salinan kode adalah sebagai berikut:
// utas utama
Ayah kelas publik memperluas thread {
public void run () {
Anak s = new son ();
s.start ();
s.join ();
...
}
}
// utas anak
Son kelas publik memperluas utas {
public void run () {
...
}
}
menjelaskan:
Di atas adalah dua kelas ayah (kelas utas utama) dan putra (kelas subthread). Karena putra diciptakan dan dimulai pada ayah, ayah adalah kelas utas utama dan putra adalah kelas utas anak.
Di utas utama ayah, buat "Thread S Child S" baru melalui New Son (). Kemudian mulailah "Child Thread S" melalui S.Start () dan hubungi S.Join (). Setelah menelepon S.Join (), utas utama ayah akan menunggu sampai "Thread S" selesai; Inilah yang kami sebut "Peran bergabung () adalah membuat utas utama menunggu utas anak berakhir sebelum dapat terus berjalan"!
2. Analisis Kode Sumber Bergabung () (berdasarkan JDK1.7.0_40)
Salinan kode adalah sebagai berikut:
public final void join () melempar interruptedException {
Bergabunglah (0);
}
Final Publik Sinkronisasi Void Join (Long Millis)
melempar interruptedException {
basis panjang = system.currentTimemillis ();
Panjang sekarang = 0;
if (millis <0) {
Lempar IllegalArgumentException baru ("Nilai batas waktu adalah negatif");
}
if (millis == 0) {
while (isAlive ()) {
tunggu (0);
}
} kalau tidak {
while (isAlive ()) {
Long Delay = Millis - Sekarang;
if (tunda <= 0) {
merusak;
}
tunggu (tunda);
sekarang = system.currentTimeMillis () - base;
}
}
}
menjelaskan:
Dari kode, kita dapat menemukannya. Ketika millis == 0, itu akan memasuki loop while (isAlive ());
Kami memahami penggunaan gabung () berdasarkan kode di atas saat menjelaskan peran goin ()!
pertanyaan:
Meskipun tempat di mana s.join () dipanggil terjadi di "Thread Utama Ayah", S.Join () disebut gabungan () melalui "Thread Child Thread S". Kemudian, isAlive () dalam metode gabungan () harus menentukan apakah "utas anak" adalah keadaan hidup; Tetapi jika ini masalahnya, bagaimana fungsi s.join () menjadi "biarkan utas utama menunggu sampai benang anak selesai", itu seharusnya membiarkan benang anak menunggu (karena metode tunggu dari utas anak objek S disebut dengan baik) "?
Jawaban: Fungsi tunggu () adalah untuk membuat "utas saat ini" tunggu, dan "utas saat ini" di sini mengacu pada utas yang saat ini berjalan di CPU. Oleh karena itu, meskipun metode tunggu () dari utas anak disebut, itu dipanggil melalui "utas utama";
3. JOW () Contoh
Setelah memahami peran bergabung (), mari kita periksa penggunaan gabungan () melalui contoh.
Salinan kode adalah sebagai berikut:
// Kode Sumber Jointest.java
kelas publik {{
public static void main (string [] args) {
mencoba {
Threada t1 = threada baru ("t1");
t1.start (); // Mulai "Thread T1"
t1.join (); // Tambahkan "Thread T1" ke "Utama Utama", dan "utas utama () akan menunggu untuk menyelesaikannya"
System.out.printf ("%s finish/n", thread.currentThread (). GetName ());
} catch (InterruptedException e) {
e.printstacktrace ();
}
}
kelas statis threada memperluas thread {
threada publik (nama string) {
super (nama);
}
public void run () {
System.out.printf ("%s start/n", this.getName ());
// Operasi penundaan
untuk (int i = 0; i <1000000; i ++)
;
System.out.printf ("%s finish/n", this.getName ());
}
}
}
Hasil Menjalankan:
Salinan kode adalah sebagai berikut:
T1 mulai
T1 selesai
Hasil akhir utama
Deskripsi Hasil:
Proses operasi ditunjukkan pada gambar
(01) Buat "Thread T1" baru di "Thread Utama Utama" melalui Threada baru ("T1"). Selanjutnya, mulailah "Thread T1" melalui t1.start () dan jalankan t1.join ().
(02) Setelah mengeksekusi t1.join (), "utas utama utama" akan memasuki "status pemblokiran" dan menunggu akhir menjalankan T1. Setelah "Utas Anak T1" selesai, "utas utama utama" akan dibangunkan, dan "utas utama" akan mendapatkan kembali hak eksekusi CPU dan terus berjalan.