Bergabung secara harfiah berarti bergabung. Mari kita lihat penjelasan dan implementasi metode gabungan.
/*** Menunggu utas ini mati. * Utas penelepon (utas yang memanggil metode gabungan) melakukan operasi tunggu sampai utas yang dipanggil (utas yang dimiliki metode bergabung) dan dibangunkan lagi * <p> Doa metode ini berperilaku persis sama dengan cara yang sama seperti doa * * * @Throws InterruptedException * jika ada utas yang mengganggu utas saat ini. Status * <i> yang terputus </i> dari utas saat ini * dibersihkan saat pengecualian ini dilemparkan. */ public final void join () melempar InterruptedException {goin (0); }Di sini bergabung dipanggil
/** * Menunggu paling banyak {@code millis} jutaan orang untuk utas ini untuk * mati. Timeout {@code 0} berarti menunggu eksekusi utas berakhir, atau waktu tunggu maksimum yang ditentukan telah tiba, utas penelepon dibangunkan lagi. Jika waktu tunggu maksimum adalah 0, Anda hanya bisa menunggu eksekusi utas berakhir sebelum Anda bisa bangun. * <p> Implementasi ini menggunakan loop {@code this.wait} panggilan * dikondisikan pada {@code this.isalive}. Saat utas mengakhiri metode * {@code this.notifyAll} dipanggil. Disarankan agar * aplikasi tidak menggunakan {@code tunggu}, {@code notify}, atau * {@code notifyall} di {@code thread} instance. * * */ public final disinkronkan void join (long millis) melempar interruptedException {long base = system.currentTimeMillis (); Panjang sekarang = 0; if (millis <0) {melempar IllegalArgumentException baru ("Nilai batas waktu negatif"); } if (millis == 0) {while (isAlive ()) {tunggu (0); }} else {while (isAlive ()) {long delay = millis - sekarang; if (tunda <= 0) {break; } tunggu (tunda); sekarang = system.currentTimeMillis () - base; }}} Dapat dilihat bahwa metode gabungan itu sendiri mengimplementasikan menunggu melalui metode tunggu. Diperian di sini bahwa jika utas masih berjalan, terus tunggu. Jika waktu yang ditentukan telah tiba, atau utas telah selesai berjalan, kode terus dijalankan ke bawah, dan utas panggilan dapat menjalankan logika selanjutnya.
Tapi di sini saya tidak melihat di mana harus memanggil metode notify atau notifyAll. Jika tidak dipanggil, utas penelepon akan terus menunggu. Di mana metode untuk membangunkannya? Melalui verifikasi, ditemukan bahwa ketika utas berakhir, mesin virtual Java mengeksekusi metode keluar lokal utas.
// Fungsi keluar utas: void javathread :: exit (bool dashar_vm, exittype exit_type) {... // Ini akan menangani logika penghancuran terkait gabungan. ObjectLocker Lock (Threadobj, Thread); thread-> clear_pending_exception (); java_lang_thread :: set_thread_status (threadobj (), java_lang_thread :: diakhiri); java_lang_thread :: set_thread (threadobj (), null); // Di sini kami memanggil metode NotifyAll untuk membangunkan lock utas tunggu. Notify_all (utas); thread-> clear_pending_exception (); }Ini akan mengerti ketika utas dibangunkan. Mari kita tulis contoh di bawah ini untuk melihat efeknya.
Public Class Jointest {public static void main (string [] args) {threadboy boy = new threadboy (); boy.start (); } kelas statis Threadboy memperluas thread {@Override public void run () {System.out.println ("Boy and Girl siap berbelanja"); ThreadGirl girl = new threadgirl (); girl.start (); coba {girl.join (); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("The Boy and The Girl Start Shopping"); }} kelas statis ThreadGirl memperluas thread {@Override public void run () {int time = 5000; System.out.println ("Gadis itu mulai merias wajah, bocah itu menunggu ..."); coba {thread.sleep (waktu); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("Gadis itu selesai dengan makeup!, Waktu diambil" + waktu); }}}} Hasil eksekusi adalah:
Anak laki -laki dan perempuan itu pergi berbelanja dan gadis itu mulai merias wajah, anak laki -laki itu sedang menunggu. . .
Riasan gadis itu sudah selesai! , 5000
Anak laki -laki dan perempuan itu mulai berbelanja
Anak laki -laki dan perempuan itu akan berbelanja. Gadis itu perlu memakai riasan terlebih dahulu. Setelah gadis itu selesai makeup, dia akan pergi berbelanja bersama.
Jadi apa penggunaan gabungan (waktu)?
Public Class Jointest {public static void main (string [] args) {threadboy boy = new threadboy (); boy.start (); } kelas statis Threadboy memperluas thread {@Override public void run () {System.out.println ("Boy and Girl siap berbelanja"); ThreadGirl girl = new threadgirl (); girl.start (); waktu int = 2000; coba {girl.join (waktu); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("The Boy Waited" + Time + ", saya tidak ingin menunggu lagi, saya pergi berbelanja"); }} kelas statis ThreadGirl memperluas thread {@Override public void run () {int time = 5000; System.out.println ("Gadis itu mulai merias wajah, bocah itu sedang menunggu ..."); coba {thread.sleep (waktu); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("Gadis itu selesai mengarang!, Waktu diambil" + waktu); }}} Di sini, metode gabungan hanya diganti dengan metode gabungan (waktu). Deskripsi telah diubah, dan hasil pencetakannya adalah:
Anak laki -laki dan perempuan itu pergi berbelanja dan gadis itu mulai merias wajah, anak laki -laki itu sedang menunggu. . .
Bocah itu menunggu 2.000, dan tidak ingin menunggu lagi. Dia pergi berbelanja dan gadis itu selesai merias wajah! , 5000
Bocah itu menunggu waktu untuk bergabung (waktu). Jika utas tempat gadis itu berada belum dieksekusi setelah waktu ini tiba, dia tidak akan menunggu lagi dan terus mengeksekusi logika berikutnya, hanya untuk berbelanja sendiri tanpa menunggu gadis itu.
Dari sini kita dapat melihat bahwa metode gabungan adalah untuk mencapai eksekusi sinkron dua utas dengan lebih nyaman. Thread 1 mengeksekusi. Setelah bertemu Thread 2, tunggu Thread 2 untuk dieksekusi, dan kemudian terus mengeksekusi eksekusi Thread 1. Arti bergabung sekarang lebih visual.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.