تشمل المحتويات المشاركة في هذا الفصل:
1. انضمام () مقدمة
2. Join () تحليل رمز المصدر (استنادًا إلى JDK1.7.0_40)
3. الانضمام () مثال
1. انضمام () مقدمة
تم تعريف الانضمام () في thread.java.
دور Join (): دع "الخيط الرئيسي" ينتظر أن ينتهي "خيط الطفل" قبل الاستمرار في الجري. قد تكون هذه الجملة غامضة بعض الشيء ، لكن يجب أن نفهمها من خلال الأمثلة:
نسخة الكود كما يلي:
// الموضوع الرئيسي
والد الطب العام يمتد الموضوع {
تشغيل الفراغ العام () {
الابن s = الابن الجديد () ؛
S.Start () ؛
S.Join () ؛
...
}
}
// خيط الطفل
يمتد ابن الطبقة العامة الموضوع {
تشغيل الفراغ العام () {
...
}
}
يوضح:
ما سبق هما فئتان الأب (فئة الخيط الرئيسي) و SON (فئة الفروع). نظرًا لأن الابن قد تم إنشاؤه وبدأه في الأب ، فإن الأب هو فئة الخيط الرئيسية والابن هو فئة خيط الطفل.
في الخيط الرئيسي للأب ، قم بإنشاء "خيط طفل S" جديد من خلال الابن الجديد (). ثم ابدأ "خيط الطفل S" من خلال S.Start () واتصل S.Join (). بعد استدعاء S.Join () ، سينتظر الخيط الرئيسي للأب حتى يتم الانتهاء من "خيط الطفل S" ؛ هذا ما نسميه "دور Join () هو جعل الموضوع الرئيسي ينتظر حتى ينتهي موضوع الطفل قبل أن يتمكن من الاستمرار في التشغيل"!
2. Join () تحليل رمز المصدر (استنادًا إلى JDK1.7.0_40)
نسخة الكود كما يلي:
{رميات الفراغ النهائي العام ()
انضم (0) ؛
}
انضمام باطل متزامن عام متزامن (ملليس طويل)
رميات interruptedException {
قاعدة طويلة = system.currentTimeMillis () ؛
طويل الآن = 0 ؛
if (millis <0) {
رمي جديد غير شرعي ("قيمة المهلة سلبية") ؛
}
if (millis == 0) {
بينما (isalive ()) {
انتظر (0) ؛
}
} آخر {
بينما (isalive ()) {
تأخير طويل = ميليس - الآن ؛
إذا (تأخير <= 0) {
استراحة؛
}
انتظر (تأخير) ؛
الآن = system.currentTimeMillis () - قاعدة ؛
}
}
}
يوضح:
من الكود ، يمكننا العثور عليه. عندما يكون Millis == 0 ، سوف يدخل حلقة There (Isalive ()) ؛
نحن نفهم استخدام Join () بناءً على الكود أعلاه عند شرح دور Join ()!
سؤال:
على الرغم من أن المكان الذي يسمى S.Join () يحدث في "الخيط الرئيسي الأب" ، إلا أن S.Join () يسمى Join () من خلال "خيط الطفل S". بعد ذلك ، يجب أن تحدد Isalive () في طريقة Join () ما إذا كان "خيط الطفل" هو الحالة على قيد الحياة ؛ ولكن إذا كان هذا هو الحال ، فكيف يمكن أن تكون وظيفة S.Join () "اترك الخيط الرئيسي ينتظر حتى يكمل مؤشر ترابط الطفل" ، فيجب أن يكون خيط الطفل ينتظر (لأن طريقة الانتظار لخيط الطفل الكائن S يسمى جيدا) "؟
الإجابة: تتمثل وظيفة Wait () في جعل "الخيط الحالي" الانتظار ، ويشير "الخيط الحالي" هنا إلى مؤشر الترابط الذي يعمل حاليًا على وحدة المعالجة المركزية. لذلك ، على الرغم من أن طريقة Wait () تسمى خيط الطفل ، إلا أنها تسمى "الخيط الرئيسي" ؛
3. الانضمام () مثال
بعد فهم دور Join () ، دعنا نتحقق من استخدام Join () من خلال الأمثلة.
نسخة الكود كما يلي:
// consist.java كود المصدر
الطبقة العامة المفصل {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
يحاول {
Threada T1 = new threada ("T1") ؛
T1.start () ؛
t1.oin ()
system.out.printf ("٪ s finish/n" ، thread.currentThRead (). getName ()) ؛
} catch (InterruptedException e) {
E.PrintStackTrace () ؛
}
}
يمتد Threada الفئة الثابتة الموضوع {
public threada (اسم السلسلة) {
سوبر (الاسم) ؛
}
تشغيل الفراغ العام () {
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"). بعد ذلك ، ابدأ "Thread T1" من خلال t1.start () وتنفيذ T1.join ().
(02) بعد تنفيذ T1.oin () ، سيدخل "الخيط الرئيسي الرئيسي" "حالة الحظر" وانتظر نهاية تشغيل T1. بعد اكتمال "خيط الطفل T1" ، سيتم إيقاظ "الخيط الرئيسي الرئيسي" ، وسيستعيد "الخيط الرئيسي" حقوق تنفيذ وحدة المعالجة المركزية ويستمر في التشغيل.