เข้าร่วมหมายถึงการเข้าร่วมอย่างแท้จริง ลองมาดูคำอธิบายและการใช้วิธีการเข้าร่วม
/*** รอให้เธรดนี้ตาย * เธรดผู้โทร (เธรดที่เรียกวิธีการเข้าร่วม) ทำการดำเนินการรอจนกว่าเธรดที่เรียกว่า (เธรดที่วิธีการเข้าร่วมจะสิ้นสุดลง) และจะตื่นขึ้นมาอีกครั้ง * <p> การเรียกใช้วิธีนี้ทำงานในลักษณะเดียวกันกับการเรียกใช้ * * * @throws ขัดจังหวะ สถานะ * <i> ที่ถูกขัดจังหวะ </i> ของเธรดปัจจุบันจะถูกล้าง * เมื่อมีการโยนข้อยกเว้นนี้ */ โมฆะสุดท้ายสาธารณะเข้าร่วม () พ่น InterruptedException {เข้าร่วม (0); -ที่นี่เข้าร่วมเรียกว่า
/** * รอมากที่สุด {@code millis} ล้านวินาทีสำหรับเธรดนี้เป็น * ตาย การหมดเวลาของ {@code 0} หมายถึงการรอให้การดำเนินการเธรดสิ้นสุดลงหรือเวลารอสูงสุดที่ระบุมาถึงเธรดของผู้โทรจะถูกปลุกอีกครั้ง หากเวลารอสูงสุดคือ 0 คุณสามารถรอให้การดำเนินการเธรดสิ้นสุดลงก่อนที่คุณจะตื่นขึ้นมา * <p> การใช้งานนี้ใช้ลูปของ {@code this.wait} การโทร * ปรับอากาศบน {@code this.isalive} เมื่อเธรดสิ้นสุดเมธอด * @code this.notifyall} จะถูกเรียกใช้ ขอแนะนำให้ * แอปพลิเคชันไม่ได้ใช้ {@code wait}, {@code Notify}, หรือ * {@code Notifyall} บน {@code เธรด} อินสแตนซ์ * * */ public final synchronized voin เข้าร่วม (Long Millis) พ่น InterruptedException {long base = system.currentTimeMillis (); Long Now = 0; ถ้า (มิลลิส <0) {โยน unlegalargumentException ใหม่ ("ค่าการหมดเวลาเป็นลบ"); } if (millis == 0) {ในขณะที่ (isalive ()) {รอ (0); }} else {ในขณะที่ (isalive ()) {long lay = millis - ตอนนี้; ถ้า (ล่าช้า <= 0) {break; } รอ (ล่าช้า); ตอนนี้ = System.currentTimeMillis () - ฐาน; - จะเห็นได้ว่าวิธีการเข้าร่วมนั้นใช้วิธีการรอคอย มันถูกตัดสินที่นี่ว่าหากเธรดยังคงทำงานอยู่ให้รอต่อไป หากเวลาที่กำหนดมาถึงแล้วหรือเธรดทำงานเสร็จแล้วรหัสจะดำเนินการต่อไปและเธรดการโทรสามารถเรียกใช้ตรรกะที่ตามมาได้
แต่ที่นี่ฉันไม่เห็นว่าจะเรียกวิธีการแจ้งเตือนหรือแจ้งเตือนได้ที่ไหน หากไม่ได้เรียกว่าเธรดผู้โทรจะรออยู่เรื่อย ๆ วิธีการปลุกมันที่ไหน? จากการตรวจสอบพบว่าเมื่อเธรดสิ้นสุดลงเครื่องเสมือน Java จะดำเนินการวิธีการออกในท้องถิ่นของเธรด
// ฟังก์ชั่นทางออกของเธรด: โมฆะ javathread :: ออก (bool destion_vm, exittype exit_type) {... // สิ่งนี้จะจัดการตรรกะการทำลายที่เกี่ยวข้องกับการเข้าร่วม uste_join (นี่); ... } // ประมวลผลดุลการ ObjectLocker Lock (Threadobj, Thread); เธรด-> clear_pending_exception (); java_lang_thread :: set_thread_status (threadobj (), java_lang_thread :: สิ้นสุดลง); java_lang_thread :: set_thread (threadobj (), null); // ที่นี่เราเรียกวิธีการ NotifyAll เพื่อปลุกเธรดรอล็อค. NOTHIFY_ALL (เธรด); เธรด-> clear_pending_exception (); -สิ่งนี้จะเข้าใจเมื่อมีการปลุกเธรด มาเขียนตัวอย่างด้านล่างเพื่อดูเอฟเฟกต์
ระดับสาธารณะร่วมกัน {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {Threadboy boy = new Threadboy (); boy.start (); } คลาสสแตติกคลาส Threadboy ขยายเธรด {@Override โมฆะสาธารณะ Run () {System.out.println ("Boy and Girl พร้อมที่จะไปช้อปปิ้ง"); threadgirl girl = new Threadgirl (); girl.start (); ลอง {girl.join (); } catch (interruptedException e) {e.printStackTrace (); } system.out.println ("The Boy and the Girl เริ่มช้อปปิ้ง"); }} คลาสสแตติก ThreadGirl ขยายเธรด {@Override โมฆะสาธารณะเรียกใช้ () {int time = 5000; System.out.println ("หญิงสาวเริ่มแต่งหน้าเด็กชายกำลังรอ ... "); ลอง {thread.sleep (เวลา); } catch (interruptedException e) {e.printStackTrace (); } system.out.println ("หญิงสาวเสร็จสิ้นด้วยการแต่งหน้า!, เวลาที่ใช้" + เวลา); - ผลการดำเนินการคือ:
เด็กชายและเด็กหญิงกำลังออกไปช็อปปิ้งและเด็กผู้หญิงก็เริ่มแต่งหน้าเด็กชายกำลังรออยู่ - -
การแต่งหน้าของหญิงสาวเสร็จสิ้นแล้ว! , 5,000
เด็กชายและเด็กหญิงเริ่มช้อปปิ้ง
เด็กชายและหญิงสาวกำลังจะไปช้อปปิ้ง หญิงสาวต้องแต่งหน้าก่อน หลังจากหญิงสาวแต่งหน้าเสร็จแล้วเธอจะไปช้อปปิ้งด้วยกัน
การใช้งานของการเข้าร่วม (เวลา) คืออะไร?
ระดับสาธารณะร่วมกัน {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {Threadboy boy = new Threadboy (); boy.start (); } คลาสสแตติกคลาส Threadboy ขยายเธรด {@Override โมฆะสาธารณะ Run () {System.out.println ("Boy and Girl พร้อมที่จะไปช้อปปิ้ง"); threadgirl girl = new Threadgirl (); girl.start (); เวลา int = 2000; ลอง {girl.join (เวลา); } catch (interruptedException e) {e.printStackTrace (); } system.out.println ("The Boy Waited" + Time + "ฉันไม่ต้องการรออีกต่อไปฉันไปซื้อของ"); }} คลาสสแตติก ThreadGirl ขยายเธรด {@Override โมฆะสาธารณะเรียกใช้ () {int time = 5000; System.out.println ("หญิงสาวเริ่มแต่งหน้าเด็กชายกำลังรอ ... "); ลอง {thread.sleep (เวลา); } catch (interruptedException e) {e.printStackTrace (); } system.out.println ("หญิงสาวทำเสร็จแล้ว!, เวลาที่ใช้" + เวลา); - ที่นี่วิธีการเข้าร่วมจะถูกแทนที่ด้วยวิธีการเข้าร่วม (เวลา) เท่านั้น คำอธิบายมีการเปลี่ยนแปลงและผลการพิมพ์คือ:
เด็กชายและเด็กหญิงกำลังออกไปช็อปปิ้งและเด็กผู้หญิงก็เริ่มแต่งหน้าเด็กชายกำลังรออยู่ - -
เด็กชายรอ 2,000 และไม่ต้องการรออีกต่อไป เขาไปช้อปปิ้งและผู้หญิงคนนั้นใส่เครื่องสำอาง! , 5,000
เด็กชายรอเวลาเข้าร่วม (เวลา) หากกระทู้ที่หญิงสาวไม่ได้ถูกประหารชีวิตหลังจากเวลานี้มาถึงเขาจะไม่รออีกต่อไปและดำเนินการตามตรรกะที่ตามมาต่อไปเพื่อไปช็อปปิ้งด้วยตัวเองโดยไม่ต้องรอผู้หญิง
จากนี้เราจะเห็นได้ว่าวิธีการเข้าร่วมคือการดำเนินการแบบซิงโครนัสของสองเธรดที่สะดวกยิ่งขึ้น เธรด 1 ดำเนินการ หลังจากพบเธรด 2 รอให้เธรด 2 ดำเนินการแล้วดำเนินการดำเนินการดำเนินการของเธรด 1 ต่อไป ความหมายของการเข้าร่วมเป็นภาพมากขึ้น
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น