سلاسل جافا - الفرق بين السكون والانتظار والإخطار
كلتا الطريقتين sleep() و wait() إيقاف مؤشر الترابط الحالي مؤقتا واستئناف مسار التنفيذ الخاص به بعد إشعار يتم تشغيله بعد فترة زمنية معينة أو بواسطة عملية أخرى.الانتظار < / span >< span style = "عائلة الخط: وراثة ؛" يمكن إيقاظ > < / span > بواسطة مؤشر ترابط آخر يستدعي نمط إخطار < / span >< span style = "عائلة الخط: وراثة ؛" >. < / span>من المهم أن الانتظار < / span >< span style = "عائلة الخط: وراثة ؛" > et إخطار < / span >< span style = "عائلة الخط: وراثة ؛" > < / span > يتم استدعاؤه في كتلة متزامن< / سبان> الذي يستخدم للاستبعاد المتبادل. الطريقة إخطار < / span >< span style = "عائلة الخط: وراثة ؛" > < / span > يوقظ العملية الأولى التي أدت إلى wait.
مثال على waitify() وnotify ()
في هذا البرنامج ، تعمل العملية B داخل العملية A وتنشئ منطقة استبعاد متبادلة لمنع ومنع العملية A من تنفيذ العبارة بعد الكتلة try/catch.public class Thread_A {
الفراغ العام الثابت الرئيسي (String[] args) {
Thread Thread_B = مؤشر ترابط جديد (جديد Runnable() {
@Override
تشغيل الفراغ العام () {
متزامن (هذا) {
int i = 0;
بينما (i< 100) < BR / > I ++ ؛
// مؤشر ترابط مجاني A
إخطار () ؛
}
}
}) ؛
Thread_B.start();
متزامن (Thread_B) {
حاول {
System.out.println ("تم حظر مؤشر الترابط A - في انتظار مؤشر الترابط B" +
"لإكمال") ؛
// ضع مؤشر ترابط A
Thread_B.wait () قيد الانتظار ؛
} catch (InterruptedException e) {
// TODO كتلة الصيد التي تم إنشاؤها تلقائيا
e.printStackTrace ();
}
System.out.println ("اكتمل مؤشر الترابط B - تم تحرير مؤشر الترابط A") ؛
}
}
}
< / pre>OutputThread A عالق في انتظار اكتمال مؤشر الترابط B
انتهى مؤشر الترابط B. يتم تحرير مؤشر ترابط A
< / pre>مثال على النوم () < / h2 >
نمط sleep() بتأمين عملية وتنفيذها لفترة زمنية محددة. تستخدم هذه الطريقة للمزامنة مع الوقت (على سبيل المثال ، الاستيقاظ بعد 4 ثوان) أو لقول النوم والسماح بتشغيل سلاسل الرسائل الأخرى.public class Sleep {
الفراغ العام الثابت الرئيسي (سلسلة [] args) {
ThreadA a = ThreadA جديد ();
a.start();
ThreadB b = ThreadB جديد ();
b.start();
}
فئة ثابتة ThreadA يمتد مؤشر الترابط {
@Override
تشغيل الفراغ العام () {
try {
System.out.println ("Thread A") ؛ < نوم > (4000) ؛
System.out.println ("الموضوع أ: نمت لمدة 4 ثوان") ؛
} catch (InterruptedException e) {
// TODO كتلة الصيد التي تم إنشاؤها تلقائيا
e.printStackTrace ();
}
}
}
فئة ثابتة ThreadB يمتد Thread {
@Override
تشغيل الفراغ العام () {
System.out.println ("Thread B") ؛
int sum = 0 ؛
for (int i = 0 ؛ i < 50 ؛ i ++)
sum +=i ؛
System.out.println ("الموضوع ب: انتهيت") ؛
}
}
}
< / pre>OutputThread A
Thread B
Thread B: انتهيت < br / > الموضوع A: نمت لمدة 4 ثوان
< / pre> بدأت العملية A قبل العملية B ولكن B قامت بالمعالجة أثناء العملية A كان نائما وأنهى أول < / Div>