เนื้อหาที่เกี่ยวข้องในบทนี้รวมถึง:
1. เข้าร่วม () บทนำ
2. เข้าร่วม () การวิเคราะห์ซอร์สโค้ด (ขึ้นอยู่กับ JDK1.7.0_40)
3. เข้าร่วม () ตัวอย่าง
1. เข้าร่วม () บทนำ
เข้าร่วม () ถูกกำหนดไว้ใน thread.java
บทบาทของการเข้าร่วม (): ให้ "กระทู้หลัก" รอให้ "เธรดเด็ก" สิ้นสุดลงก่อนที่จะทำงานต่อไป ประโยคนี้อาจคลุมเครือเล็กน้อย แต่เราควรเข้าใจผ่านตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
// เธรดหลัก
พ่อชั้นเรียนสาธารณะขยายหัวข้อ {
โมฆะสาธารณะเรียกใช้ () {
ลูกชาย s = ลูกชายคนใหม่ ();
S.Start ();
S.Join ();
-
-
-
// เธรดลูก
ลูกชายชั้นเรียนสาธารณะขยายเธรด {
โมฆะสาธารณะเรียกใช้ () {
-
-
-
ภาพประกอบ:
ข้างต้นเป็นสองชั้นเรียนพ่อ (คลาสเธรดหลัก) และลูกชาย (คลาสย่อย) เพราะลูกชายถูกสร้างขึ้นและเริ่มต้นในพ่อพ่อจึงเป็นชั้นเรียนหลักและลูกชายเป็นชั้นด้ายเด็ก
ในหัวข้อหลักของพ่อสร้าง "Thil Thread S" ใหม่ผ่าน SON SON () จากนั้นเริ่ม "Threed Thread S" ผ่าน S.Start () และโทร S.Join () หลังจากโทรหา S.Join () กระทู้หลักของพ่อจะรอจนกว่า "ด้ายลูก" จะเสร็จสิ้น นี่คือสิ่งที่เราเรียกว่า "บทบาทของการเข้าร่วม () คือการทำให้เธรดหลักรอให้เธรดลูกสิ้นสุดก่อนที่มันจะสามารถทำงานต่อไปได้"!
2. เข้าร่วม () การวิเคราะห์ซอร์สโค้ด (ขึ้นอยู่กับ JDK1.7.0_40)
การคัดลอกรหัสมีดังนี้:
โมฆะสุดท้ายสาธารณะเข้าร่วม () พ่น InterruptedException {
เข้าร่วม (0);
-
การเข้าร่วมเป็นโมฆะครั้งสุดท้ายที่ซิงโครไนซ์สาธารณะ (Long Millis)
พ่น InterruptedException {
ฐานยาว = System.currentTimeMillis ();
Long Now = 0;
ถ้า (มิลลิส <0) {
โยน unlegalargumentException ใหม่ ("ค่าหมดเวลาเป็นลบ");
-
if (millis == 0) {
ในขณะที่ (isalive ()) {
รอ (0);
-
} อื่น {
ในขณะที่ (isalive ()) {
ล่าช้านาน = มิลลิส - ตอนนี้;
ถ้า (ล่าช้า <= 0) {
หยุดพัก;
-
รอ (ล่าช้า);
ตอนนี้ = System.currentTimeMillis () - ฐาน;
-
-
-
ภาพประกอบ:
จากรหัสเราสามารถค้นหาได้ เมื่อมิลลิส == 0 มันจะเข้าสู่การวนซ้ำ (isalive ())
เราเข้าใจการใช้งานของการเข้าร่วม () ตามรหัสข้างต้นเมื่ออธิบายบทบาทของการเข้าร่วม ()!
คำถาม:
แม้ว่าสถานที่ที่ S.Join () เรียกว่าเกิดขึ้นใน "Father Main Thread", S.Join () เรียกว่าเข้าร่วม () ถึง "Thil Thread S" จากนั้น isalive () ในวิธีการเข้าร่วม () ควรพิจารณาว่า "ด้ายลูก" เป็นสถานะที่มีชีวิตอยู่หรือไม่ แต่ถ้าเป็นกรณีนี้ฟังก์ชั่นของ s.join () จะเป็น "ให้เธรดหลักรอจนกว่าเธรดลูกจะเสร็จสิ้น" ควรให้เธรดลูกรอ (เพราะวิธีการรอของเธรดเด็ก Object S เรียกว่าดี) "?
คำตอบ: ฟังก์ชั่นของการรอคอย () คือการรอ "เธรดปัจจุบัน" และ "เธรดปัจจุบัน" ที่นี่หมายถึงเธรดที่กำลังทำงานอยู่บน CPU ดังนั้นถึงแม้ว่าวิธีการรอคอย () ของด้ายลูกเรียกว่ามันถูกเรียกผ่าน "เธรดหลัก";
3. เข้าร่วม () ตัวอย่าง
หลังจากทำความเข้าใจบทบาทของการเข้าร่วม () ให้ตรวจสอบการใช้งานของการเข้าร่วม () ผ่านตัวอย่าง
การคัดลอกรหัสมีดังนี้:
// joinnest.java ซอร์ส
ชั้นเรียนสาธารณะร่วมกัน {
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
พยายาม {
threada t1 = threada ใหม่ ("t1");
t1.start ();
t1.join ();
System.out.printf ("%s finish/n", thread.currentthread (). getName ());
} catch (interruptedException e) {
E.PrintStackTrace ();
-
-
Threada คลาสคงที่ขยายเธรด {
Threada สาธารณะ (ชื่อสตริง) {
super (ชื่อ);
-
โมฆะสาธารณะเรียกใช้ () {
System.out.printf ("%s start/n", this.getName ());
// การดำเนินการล่าช้า
สำหรับ (int i = 0; i <1000000; i ++)
-
System.out.printf ("%s finish/n", this.getName ());
-
-
-
ผลการทำงาน:
การคัดลอกรหัสมีดังนี้:
T1 เริ่มต้น
T1 เสร็จสิ้น
เสร็จสิ้น
ผลลัพธ์คำอธิบาย:
กระบวนการดำเนินการจะแสดงในรูป
(01) สร้าง "เธรด T1" ใหม่ใน "Main Thread Main" ผ่าน Threada ใหม่ ("T1") ถัดไปเริ่มต้น "เธรด T1" ผ่าน t1.start () และดำเนินการ t1.join ()
(02) หลังจากดำเนินการ t1.join () "Main Thread Main" จะเข้าสู่ "การปิดกั้นสถานะ" และรอการสิ้นสุดของการทำงานของ T1 หลังจาก "Thread Thread T1" เสร็จสิ้นแล้ว "Main Thread Main" จะถูกปลุกขึ้นมาและ "เธรดหลัก" จะได้รับสิทธิ์ในการดำเนินการ CPU และดำเนินการต่อไป