تشمل المحتويات المشاركة في هذا الفصل:
1. مقدمة للنوم ()
2. نوم () مثال
3. مقارنة بين النوم () وانتظر ()
1. مقدمة للنوم ()
يتم تعريف النوم () في thread.java.
تتمثل وظيفة النوم () في السماح للخيط الحالي بالنوم ، أي أن الخيط الحالي سوف يدخل من "حالة الجري" إلى "حالة النوم (الحظر)". سيحدد النوم () وقت النوم ، وسيكون وقت النوم أكبر من وقت النوم ؛ وحدة المعالجة المركزية المراد تنفيذها.
2. نوم () مثال
فيما يلي مثال بسيط لإظهار استخدام النوم ().
نسخة الكود كما يلي:
// كود المصدر لـ Severtest.java
يمتد الفئة Threada Thread {
public threada (اسم السلسلة) {
سوبر (الاسم) ؛
}
تشغيل void متزامن عام () {
يحاول {
لـ (int i = 0 ؛ i <10 ؛ i ++) {
system.out.printf ("٪ s: ٪ d/n" ، this.getName () ، i) ؛
// عندما يمكن تقسيمها على 4 ، أنام مقابل 100 ميلي ثانية
إذا (i ٪ 4 == 0)
thread.sleep (100) ؛
}
} catch (InterruptedException e) {
E.PrintStackTrace () ؛
}
}
}
الفئة العامة Sleeptest {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
threada t1 = new threada ("t1") ؛
t1.start () ؛
}
}
نتائج التشغيل:
نسخة الكود كما يلي:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
وصف النتائج:
البرنامج بسيط نسبيًا ، بدء تشغيل THE T1 في مؤشر الترابط الرئيسي الرئيسي. بعد بدء تشغيل T1 ، عندما يمكن تقسيم الحساب I في T1 على 4 ، سينام T1 مقابل 100 ميلي ثانية من خلال Thread.sleep (100).
مقارنة بين النوم () وانتظر ()
نحن نعلم أن وظيفة WAIT () هي السماح للمعلومات الحالية بإدخال حالة "الانتظار (حظر) من" حالة الجري "وأيضًا إطلاق قفل التزامن. تتمثل وظيفة النوم () في السماح لخيط الخيط الحالي بإدخال "حالة النوم (الحظر)" من "حالة الجري".
ومع ذلك ، انتظر () يطلق قفل تزامن الكائن ، في حين أن Sleep () لا يطلق القفل.
يوضح المثال التالي أن Sleep () لن يطلق القفل.
نسخة الكود كما يلي:
// كود SleeplockTest.java
الطبقة العامة sleeplocktest {
كائن ثابت خاص 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/n" ، this.getName () ، i) ؛
// عندما يمكن تقسيمها على 4 ، أنام مقابل 100 ميلي ثانية
إذا (i ٪ 4 == 0)
thread.sleep (100) ؛
}
} catch (InterruptedException e) {
E.PrintStackTrace () ؛
}
}
}
}
}
نتائج التشغيل:
نسخة الكود كما يلي:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
T2: 0
T2: 1
T2: 2
T2: 3
T2: 4
T2: 5
T2: 6
T2: 7
T2: 8
T2: 9
وصف النتائج:
يتم تشغيل خيطين T1 و T2 في الخيط الرئيسي الرئيسي. سيشير T1 و T2 إلى قفل المزامنة لنفس الكائن في التشغيل () ، أي متزامن (OBJ). أثناء تشغيل T1 ، على الرغم من أنها ستستدعي Thread.sleep (100) ؛ لأن T1 لا يطلق "القفل المتزامن الذي يحتفظ به OBJ"!
لاحظ أنه إذا علقت المزامنة (OBJ) وتنفيذ البرنامج مرة أخرى ، يمكن تبديل T1 و T2 إلى بعضهما البعض. فيما يلي رمز المصدر بعد حن التعليق المتزامن (OBJ):
نسخة الكود كما يلي:
// sleeplocktest.java رمز المصدر (تم التعليق عليه متزامن (OBJ))
الطبقة العامة sleeplocktest {
كائن ثابت خاص obj = كائن جديد () ؛
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
threada t1 = new threada ("t1") ؛
threada t2 = new threada ("t2") ؛
t1.start () ؛
t2.start () ؛
}
يمتد Threada الفئة الثابتة الموضوع {
public threada (اسم السلسلة) {
سوبر (الاسم) ؛
}
تشغيل الفراغ العام () {
// احصل على قفل التزامن لكائن OBJ
// Synchronized (OBJ) {
يحاول {
لـ (int i = 0 ؛ i <10 ؛ i ++) {
system.out.printf ("٪ s: ٪ d/n" ، this.getName () ، i) ؛
// عندما يمكن تقسيمها على 4 ، أنام مقابل 100 ميلي ثانية
إذا (i ٪ 4 == 0)
thread.sleep (100) ؛
}
} catch (InterruptedException e) {
E.PrintStackTrace () ؛
}
//}
}
}
}