English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

شرح طريقة wait في Object Java

طريقة wait من Java Object

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

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

بعض الطلاب يعتقدون أن thread A يمكن أن يكون في حلقة دائمة من الحكم، وتحقق من ما إذا كانت الشروط قد满足了، وليس بالضرورة أن يوقف نفسه ثم ينتظر. هذا أيضًا هو نوع من التفكير، ولكن ماذا؟ يستنزف CPU، ولا يعرف متى ستكون الشروط قد满足了.

للتنسيق والتواصل بين threads، يجب أن يكون هناك آلية الانتظار وآلية الإشعار، في JAVA، هذه هي طريقة wait وnotify.

طريقة wait لـ Object

synchronized (obj) {
    while (condition does not ok){
      obj.wait();
    }
 }

إذا كنت ترغب في أن يكون thread A في حالة الانتظار، يمكنك التشغيل لطريقة wait للمجلس الحالي. بمجرد التشغيل لطريقة wait، فإن هذا يعني: thread A قد حصل على القفل، وقد تم القيام بكل شيء يمكن القيام به، الآن يمكنه فقط الانتظار، والانتظار حتى تنفيذ بعض العمليات المتزامنة تنفيذ بعض الأكواد، وأنا أعود لأكمل العمل.

ملاحظة:

طريقة wait معرفة في الفئة الجذرية Object، Thread تنحدر من فئة Object، لذا لديها أيضًا طريقة wait. ولكن هنا ليس التشغيل لطريقة wait لمجلس الحالي، بل طريقة wait للمجلس الحالي الذي يمتلك خصائص القفل. هذا النقطة لم أستطع فهمها، أعتقد أن لتحقيق حالة انتقال thread A إلى حالة الانتظار، يجب أن يُطلق عليه notify أيضًا، يمكن أن يتم ذلك باستخدام طريقة wait وnotify لthread A، ولكن من المتوقع أن يكون التنفيذ معقدًا جدًا. بالإضافة إلى ذلك، من الناحية العملية، يبدو أن تعريف wait في Object معقول أيضًا، مما يعني أن thread عالق في حوض الانتظار للمجلس.

شكرًا على القراءة، آمل أن تساعدكم، شكرًا لدعمكم لموقعنا!

أعجبك هذا