كثيرا ما أتصفح. فيما يتعلق بالإخطار والإخطار في جافا ، غالبًا ما يكون للناس البيانات التالية:
لن يخطر الإخطار سوى كائن انتظار ، في حين أن إخطار الإخطار سوف يخطر جميع الكائنات في انتظار ، وسوف تستمر جميع الكائنات في التشغيل.
ويبدو أن هناك أمثلة لإثبات ذلك. يمكن القول أن البيان أعلاه صحيح أم لا. والسبب هو أن أحدهم مهم للغاية. البيان الرسمي كما يلي:
انتظر ، إعلام ، إخطار:
يجب أن يتم استدعاء هذه الطريقة فقط بواسطة مؤشر ترابط هو صاحب شاشة الكائن هذا. يمكن أن يصبح مؤشر الترابط صاحب شاشة الكائن هذا في واحدة من ثلاث طرق:
من خلال تنفيذ طريقة مثيل متزامن لهذا الكائن.
يتم تنفيذ هيئة البيان المتزامن عن طريق تنفيذ البيان المتزامن على هذا الكائن.
بالنسبة للكائنات من فئة النوع ، يمكنك تنفيذ طرق ثابتة متزامنة للفئة.
مؤشر ترابط واحد فقط لديه شاشة كائن في وقت واحد.
البيان أعلاه مقتطف من جافادوك. هذا يعني أنه في المكالمة ، يجب عقد شاشة الكائن (أي القفل) ، والتي يمكننا أن نفهمها على أنها تعمل داخل الطريقة المتزامنة. ثم المعنى الضمني لهذا البيان هو أنه إذا كنت ترغب في متابعة كتلة الكود الواردة في كتلة التزامن ، فأنت بحاجة إلى إعادة تلبية القفل. هذه الجملة موصوفة في Javadoc:
انتظر
تتسبب هذه الطريقة في وضع الخيط الحالي (الذي يسمى t) لوضع نفسه في مجموعة انتظار الكائن ثم التخلي عن جميع متطلبات التزامن على هذا الكائن. لأغراض جدولة مؤشرات الترابط ، يتم تعطيل مؤشر الترابط t وهو في حالة سبات قبل حدوث إحدى المواقف الأربعة التالية:
يقوم بعض مؤشرات الترابط الأخرى باستدعاء طريقة الإخطار لهذا الكائن ، ويتم تحديد مؤشر الترابط t اختياريًا كخيط إيقاظ.
يقوم بعض مؤشرات الترابط الأخرى باستدعاء طريقة الإخطار لهذا الكائن.
بعض مقاطعات مؤشر ترابط أخرى T.
تم الوصول إلى الوقت الفعلي المحدد تقريبًا. ومع ذلك ، إذا كانت المهلة صفرًا ، فلا يتم أخذ الوقت الفعلي في الاعتبار وسينتظر الخيط حتى يتم الحصول على الإخطار.
بعد ذلك ، يتم حذف مؤشر الترابط T من مجموعة انتظار الكائن ويتم تنفيذ جدولة مؤشرات الترابط مرة أخرى. ثم يتنافس الخيط مع مؤشرات الترابط الأخرى بطريقة تقليدية للحصول على الحق في المزامنة على الكائن ؛ بمجرد الحصول على السيطرة على الكائن ، سيتم استعادة جميع إعلانات التزامن على الكائن إلى حالتهم السابقة ، وهي استدعاء الانتظار
الموقف عندما تكون الطريقة. الموضوع T ثم يعود من المكالمة إلى طريقة الانتظار. لذلك ، عند العودة من طريقة الانتظار ، تكون حالة التزامن للكائن وخيط T هي نفسها تمامًا عند استدعاء طريقة الانتظار.
أي أنه يجب إعادة تشكيل القفل ، بحيث تم إخطار جميع المواضيع. ومع ذلك ، فإن هذه الخيوط سوف تتنافس ، وسوف تحصل مؤشر ترابط واحد فقط على القفل بنجاح. قبل تنفيذ هذا الموضوع ، يجب أن تنتظر مؤشرات الترابط الأخرى (ولكن ليست هناك حاجة لإخطار الإخطار هنا ، لأنه يخبر ، ومن الضروري فقط الحصول على القفل). هناك الكود التالي الذي يمكن أن يعيد إنتاج هذه الظاهرة.
أولاً ، حدد فئة مؤشر ترابط يمكن تشغيلها ، على النحو التالي:
كائن نهائي ثابت خاص OBJ = كائن جديد () ؛ الفئة الثابتة R تنفذ Runnable {int i ؛ r (int i) {this.i = i ؛ } public void run () {try {synchronized (obj) {system.out.println ("thread->" + i + "waite") ؛ obj.wait () ؛ System.out.println ("thread->" + i + "running") ؛ thread.sleep (30000) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }}} انتبه إلى داخل طريقة التشغيل أعلاه. بعد انتظار () ، نطبع جملة ، ثم نتوقف عن الكود الحالي لمدة 30 ثانية. فيما يتعلق بطريقة النوم ، يوصف على النحو التالي:
الخيط لا يفقد ملكية أي شاشات.
هذا هو ، لا يزال القفل محتجزًا.
ثم ، حدد طريقة رئيسية لتشغيل هذه الخيوط على النحو التالي:
الموضوع [] rs = موضوع جديد [10] ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {rs [i] = new thread (new r (i)) ؛ } for (thread r: rs) {r.start () ؛ } thread.sleep (5000) ؛ Synchronized (obj) {obj.notifyall () ؛ }نحدد 10 مواضيع ثم نديرها جميعًا. نظرًا لوجود انتظار ، ستنتظر 10 موضوعات بعد الطباعة "بدء تشغيل". ثم تدعو الطريقة الرئيسية إخطار. سيظهر الإخراج هنا على النحو التالي:
مؤشر ترابط-> 0 في انتظار مؤشر ترابط-> 4 في انتظار مؤشر ترابط-> 5 في انتظار مؤشر ترابط-> 3 في انتظار مؤشر ترابط-> 2 في انتظار مؤشر ترابط-> 1 في انتظار مؤشر ترابط-> 6 في انتظار مؤشر ترابط-7 في انتظار مؤشر ترابط-8 في انتظار مؤشر ترابط-> 9 انتظر مؤشر ترابط-> 9 تشغيل
... لا يوجد إخراج آخر في غضون 30 ثانية
في الإخراج أعلاه ، بعد الانتظار ، يقوم مؤشر ترابط واحد فقط بإخراج عبارة "تشغيل" ، ولمدة زمنية (30 ثانية هنا) ، لن يكون هناك إخراج آخر. وهذا يعني ، لن يتم إخراج المواضيع الأخرى بين الأقفال التي يحتفظ بها الرمز الحالي.
الاستنتاج النهائي هو: إذا كان موضوع الانتظار يريد متابعة الجري ، فيجب أن يفي بشرطين:
تم إخطار الخيط الآخر أو إخطاره ، وتم إخطار الخيط الحالي.
بعد التنافس مع المواضيع الأخرى للقفل ، تم الحصول على شرطين بنجاح من أجل القفل ، ولم يكن أي منهما مفقودًا. في الواقع ، على مستوى التنفيذ ، يحقق إخطار وإخطار نفس التأثير ، وسيستمر الخيط في التشغيل. ولكن الإخطار معفاة. الحاجة إلى إخطار المواضيع الأخرى بعد تشغيل الخيط ، لأنه تم إخطاره. عند استخدام الإخطار ومتى يجب استخدام الإخطار ، يعتمد ذلك على الموقف الفعلي.
ما سبق هو تجميع المعلومات الخاصة بـ Java Detify و AmplyAll. سنستمر في إضافة المعلومات ذات الصلة في المستقبل. شكرا لدعمكم لهذا الموقع!