تشمل المحتويات المشاركة في هذا الفصل:
1. مقدمة للعائد ()
2. العائد () مثال
3. مقارنة بين العائد () وانتظر ()
1. مقدمة للعائد ()
الغرض من العائد () هو الاستسلام. يسمح للمعلومات الحالية بالدخول إلى "الحالة الجاهزة" من "حالة الجري" ، بحيث يمكن أن تحصل على حقوق تنفيذ أخرى ، ومع ذلك ، لا تضمن مؤشرات ترابط السلاسل الحالية () ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخرون ، والآخر لها نفس الأولوية.
2. العائد () مثال
أدناه ، انظر استخدامه بالقدوة.
نسخة الكود كما يلي:
// limdtest.java رمز المصدر
يمتد الفئة Threada Thread {
public threada (اسم السلسلة) {
سوبر (الاسم) ؛
}
تشغيل void متزامن عام () {
لـ (int i = 0 ؛ i <10 ؛ i ++) {
system.out.printf ("٪ s [٪ d]: ٪ d/n" ، this.getName () ، this.getPriority () ، i) ؛
// عندما أقسم 4 ، مكالمة العائد
إذا (i ٪ 4 == 0)
thread.yield () ؛
}
}
}
فئة عامة العائد {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
threada t1 = new threada ("t1") ؛
threada t2 = new threada ("t2") ؛
t1.start () ؛
t2.start () ؛
}
}
(مرة واحدة) نتيجة العملية:
نسخة الكود كما يلي:
T1 [5]: 0
T2 [5]: 0
T1 [5]: 1
T1 [5]: 2
T1 [5]: 3
T1 [5]: 4
T1 [5]: 5
T1 [5]: 6
T1 [5]: 7
T1 [5]: 8
T1 [5]: 9
T2 [5]: 1
T2 [5]: 2
T2 [5]: 3
T2 [5]: 4
T2 [5]: 5
T2 [5]: 6
T2 [5]: 7
T2 [5]: 8
T2 [5]: 9
وصف النتائج:
عندما يمكن إجراء "Thread T1" بواسطة 4 ، فإنه لا يتحول إلى "Thread T2". هذا يدل على أنه على الرغم من أن العائد () يمكن أن يسمح لرسائل الرسائل بالدخول إلى "الحالة الجاهزة" من "حالة الجري" ؛ حتى لو كانت هذه "المواضيع الأخرى" لها نفس الأولوية مثل مؤشر ترابط الاتصال حاليًا ().
3. مقارنة بين العائد () وانتظر ()
نحن نعلم أن وظيفة WAIT () هي السماح للمعلومات الحالية بإدخال حالة "الانتظار (حظر) من" حالة الجري "وأيضًا إطلاق قفل التزامن. تتمثل وظيفة العائد () في الاستسلام ، مما سيؤدي أيضًا إلى ترك الخيط الحالي "حالة الجري". خلافاتهم هي:
(01) WAIT () هو السماح لخيط مؤشر الترابط بإدخال "Wait (حظر) حالة" من "حالة الجري" ، في حين أن عدم العائد () هو السماح لخيط الدخول إلى "الحالة الجاهزة" من "الحالة الجارية".
(02) WAIT () هو قفل المزامنة سيؤدي إلى تحرير الكائن الذي يحتفظ به ، في حين أن طريقة العائد () لن تطلق القفل.
يوضح المثال التالي أن العائد () لن يطلق القفل.
نسخة الكود كما يلي:
// limplocktest.java رمز المصدر
الطبقة العامة العائد {
كائن ثابت خاص obj = كائن جديد () ؛
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
threada t1 = new threada ("t1") ؛
threada t2 = new threada ("t2") ؛
t1.start () ؛
t2.start () ؛
}
يمتد Threada الفئة الثابتة الموضوع {
public threada (اسم السلسلة) {
سوبر (الاسم) ؛
}
تشغيل الفراغ العام () {
// احصل على قفل التزامن لكائن OBJ
متزامن (OBJ) {
لـ (int i = 0 ؛ i <10 ؛ i ++) {
system.out.printf ("٪ s [٪ d]: ٪ d/n" ، this.getName () ، this.getPriority () ، i) ؛
// عندما أقسم 4 ، مكالمة العائد
إذا (i ٪ 4 == 0)
thread.yield () ؛
}
}
}
}
}
(مرة واحدة) النتيجة:
نسخة الكود كما يلي:
T1 [5]: 0
T1 [5]: 1
T1 [5]: 2
T1 [5]: 3
T1 [5]: 4
T1 [5]: 5
T1 [5]: 6
T1 [5]: 7
T1 [5]: 8
T1 [5]: 9
T2 [5]: 0
T2 [5]: 1
T2 [5]: 2
T2 [5]: 3
T2 [5]: 4
T2 [5]: 5
T2 [5]: 6
T2 [5]: 7
T2 [5]: 8
T2 [5]: 9
وصف النتائج:
يتم تشغيل خيطين T1 و T2 في الخيط الرئيسي الرئيسي. سيشير T1 و T2 إلى قفل المزامنة لنفس الكائن في التشغيل () ، أي متزامن (OBJ). أثناء عملية T1 ، على الرغم من أنها ستستدعي Thread.yield () ؛ لأن T1 لا يطلق "القفل المتزامن الذي يحتفظ به OBJ"!