ما هو الانتظار والإخطار في Java؟



الانتظار والإخطار في Java هما الطريقتان الأخيرتان اللتان تسمحان للخيوط بالتواصل مع بعضها البعض. ستساعدك هذه المقالة في الحصول على التفاصيل

تسمح الميزة في Java بالتنفيذ المتزامن لجزئين أو أكثر من البرنامج. كل جزء هو موضوع. غالبًا ما يتعين على هذه الخيوط تنسيق أعمالها. يتم ذلك باستخدام بعض الطرق النهائية مثل الانتظار والإخطار في Java. ستساعدك هذه المقالة في فهم هذه الطرق بالتفصيل.

سأناقش المواضيع بالترتيب التالي:





هيا نبدأ!

ما هو التزامن؟

قد تأتي البرامج متعددة الخيوط بانتظام مع مواقف متعددة محاولة الوصول إلى نفس المورد الذي ينتج عنه نتائج احتيالية ومذهلة. في بعض الأحيان ، قد يحاول أكثر من مؤشر ترابط الوصول إلى مورد مشترك ، فأنت بحاجة إلى التأكد من استخدام هذا المورد بواسطة سلسلة محادثات واحدة فقط في كل مرة. يمكن القيام بذلك باستخدام التزامن في جافا.



نتحدث الآن عن الاقتراع. الاستقصاء هو عملية اختبار حالة بشكل متكرر حتى تتحقق. يتم تنفيذ هذه الطريقة بمساعدة للتحقق مما إذا كانت حالة معينة صحيحة أم لا. يمكنك استخدام هذه الطريقة للخيوط ولكن هذه الطريقة تهدر الكثير من دورات وحدة المعالجة المركزية وأيضًا يجعل عملية التنفيذ غير فعالة للغاية. لتجنب هذه الأنواع من الأخطاء ، تم تقديم طرق مثل Wait and Notify في Java.

ما هي طرق الانتظار () والإخطار ()؟

لمعالجة مشكلة تعدد مؤشرات الترابط ، هناك طرق مثل الانتظار والإخطار يستخدم. تستخدم فئة الكائن هذه الطرق الثلاثة النهائية التي تسمح لمؤشرات الترابط بالتواصل حول حالة تأمين المورد. ويطلق عليهم أيضًا اسم 'الكتل المحمية'.

إعلان مجموعة من العناصر في جافا

انتظر()

يؤدي هذا الأسلوب إلى انتظار مؤشر الترابط حتى استدعاء مؤشر ترابط آخر أساليب notify () و notifyAll () لهذا الكائن. تخبر طريقة Wait () هذه سلسلة الاستدعاء بالتخلي عن القفل والذهاب إلى وضع السكون حتى يدخل بعض الخيوط الأخرى نفس الشاشة والمكالمات لإخطار (). تحرر هذه الطريقة القفل قبل الانتظار وتستعيد القفل قبل العودة من طريقة الانتظار ().



تم دمج طريقة الانتظار () بإحكام مع قفل المزامنة. يتم ذلك باستخدام ميزة غير متوفرة مباشرة من آلية المزامنة.

بناء الجملة:

متزامنة (lockObject) {while (! condition) {lockObject.wait ()} // اتخذ الإجراء هنا}

يجب أن يمتلك مؤشر الترابط الحالي شاشة الكائن الخاصة به. يجب استدعاؤه من الطريقة المتزامنة فقط وإلا فسيتم طرح استثناء.

يخطر ()

تُستخدم هذه الطريقة لإخطار أنه يحتاج إلى العمل. يستيقظ خيطًا واحدًا يسمى ملف انتظر() الطريقة على نفس الكائن.

لاحظ أن الاتصال يخطر () في النهاية لا تتخلى عن القفل. إنه يخبر خيط انتظار أنه يمكن أن يستيقظ. ومع ذلك ، لا يتم التخلي عن القفل فعليًا حتى اكتمال كتلة المخطر المتزامنة. الآن قل ، إذا اتصلت يخطر () على مورد ولكن المخطر لا يزال بحاجة إلى تنفيذ إجراءات لمدة 10 ثوانٍ ضمن الكتلة المتزامنة الخاصة به ، سيتعين على سلسلة الرسائل التي كانت تنتظر الانتظار لمدة 10 ثوانٍ أخرى على الأقل حتى يقوم المخطر بتحرير القفل على الكائن ، على الرغم من الإخطار تم استدعاء ().

بناء الجملة:

متزامن (lockObject) {// setting_the_condition lockObject.notify () // أي رمز إضافي إذا لزم الأمر}

NotifyAll ()

تُستخدم هذه الطريقة لتنبيه جميع مؤشرات الترابط التي استدعت الانتظار () على نفس الكائن. سيتم تشغيل سلسلة الرسائل ذات الأولوية القصوى أولاً في معظم المواقف على الرغم من أنها غير مضمونة. الأشياء الأخرى هي نفس طريقة الإخطار ().

لماذا وكيف يتم استخدام Wait () و Notify () في Java؟

يجب عليك استخدام الانتظار والإخطار لأنهم مرتبطون بالقفل والكائن به قفل. على الرغم من أن الانتظار والإخطار في Java يعد مفهومًا أساسيًا تمامًا ، إلا أنه تم تعريفهما في فئة الكائن . والمثير للدهشة أنه ليس من السهل كتابة الرمز باستخدام الانتظار والإخطار. يمكنك اختبار ذلك عن طريق كتابة رمز لحل مشكلة المنتج والمستهلك باستخدام الانتظار والإخطار. مثال المستهلك المنتج - الانتظار والإخطار في Java-Edurekaهنا ، لدي مشترك طابور واثنين من المواضيعاتصل منتج و مستهلك . منتج موضوع يضع الرقم في قائمة انتظار مشتركة و مستهلك الخيط يستهلك الأرقام من الحاوية المشتركة.

الشرط هو أنه بمجرد إنتاج عنصر ما ، يجب إخطار خيط المستهلك وبالمثل ، بعد الحاجة إلى إخطار مؤشر ترابط منتج الاستهلاك. هذا بين الخيطالاتصالاتيتم تحقيقه باستخدام الانتظار والإخطار في Java.

ملحوظة : دبليو.أيت ولايتم تعريف أساليب tify في فئة الكائن، ويجب استدعاؤها داخل الكتلة المتزامنة.

مثال

فئة عامة Thread1 {public static void main (String [] args) {Thread2 b = new Thread2 () b.start () متزامنة (ب) {try {System.out.println ('Waiting for 2 to complete ...' ) b.wait ()} catch (InterruptException e) {e.printStackTrace ()} System.out.println ('Total is:' + b.total)}}} تمدد فئة Thread2 Thread1 {int totalOverride public void run () {تزامن (هذا) {لـ (int i = 0 i<=100 i++) { total += i } notify() }}}

لاحظ أنه في المثال أعلاه ، تمت مزامنة كائن Thread2 ، أي b. هذا ب يكمل الحساب قبل أن يخرج مؤشر الترابط الرئيسي قيمته الإجمالية.

انتاج:

يقودنا هذا إلى نهاية هذه المقالة حيث تعلمنا في الانتظار والإخطار في Java.آمل أن يكون المحتوى المذكور أعلاه مفيدًا في تعزيز المعرفه. استمر في القراءة ، استمر في الاستكشاف!

راجع أيضًا من Edureka ، شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250.000 متعلم راضٍ منتشرين في جميع أنحاء العالم تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java. تم تصميم الدورة التدريبية لمنحك السبق في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد مثل السبات والربيع.