يمكن ترجمته كقفل العد التنازلي (العد التنازلي). وغني عن القول ، أن المزلاج يعني ، كما يوحي الاسم ، لمنع التقدم. هنا يعني أن طريقة countDownlatch.await () ستقوم بحظر الخيط الحالي قبل العد التنازلي هو 0.
CountDownlatch عبارة عن فئة مساعدة متزامنة تتيح للانتظار واحد أو أكثر حتى يتم تنفيذ مجموعة من العمليات في مؤشرات ترابط أخرى.
تعمل CountDownLatch على غرار طريقة Thread.join () ، ويمكن استخدامها للتعاون بين مجموعة من المواضيع ومجموعة أخرى من مؤشرات الترابط. على سبيل المثال ، يحتاج الموضوع الرئيسي إلى سلسلة من الاستعدادات قبل القيام بوظيفة ، وفقط إذا تم الانتهاء من كل هذه الاستعدادات ، هل يمكن للموضوع الرئيسي مواصلة عمله. هذه الاستعدادات مستقلة عن بعضها البعض ، بحيث يمكن تنفيذها بشكل متزامن لزيادة السرعة. في هذا السيناريو ، يمكن استخدام CountDownlatch لتنسيق الجدولة بين المواضيع. في العصر الذي تم فيه إنشاء المواضيع مباشرة (قبل Java 5.0) ، يمكننا استخدام thread.join (). بعد ظهور JUC ، لأنه لا يمكن الرجوع مباشرة إلى مؤشرات الترابط في تجمع مؤشرات الترابط ، يجب استخدام CountDownlatch.
فئة CountDownlatch هي عداد متزامن. عند البناء ، يتم تمرير المعلمة int. هذه المعلمة هي القيمة الأولية للعداد. في كل مرة يتم فيها استدعاء طريقة العد التنازلي () ، يتم تقليل العداد بمقدار 1 ويكون العداد أكبر من 0 ، وسيقوم طريقة AWAIT () بمنع البرنامج وتستمر في التنفيذ. يمكن اعتبار CountDownlatch مزلاجًا للعد التنازلي ، مما يؤدي إلى حدث محدد عندما يتم تقليل العدد إلى 0. باستخدام هذه الميزة ، يمكن للمعلومات الرئيسية انتظار نهاية مؤشر ترابط الطفل. فيما يلي مثال على مسابقة رياضي محاكاة.
سيناريو التطبيق النموذجي للغاية لـ CountDownlatch هو: هناك مهمة تريد تنفيذها لأسفل ، ولكن يجب أن تنتظر حتى يتم تنفيذ مهام أخرى قبل أن تتمكن من الاستمرار في تنفيذها للأسفل. إذا كانت مهمتنا التي نريد الاستمرار في تنفيذ مزيد من المكالمات ، فإن طريقة AWAIT () لكائن CountDownlatch ، وتدعو المهام الأخرى طريقة العد التنازلي () على نفس كائن خطوط العد التنازلي بعد تنفيذ مهامها الخاصة ، فإن المهمة التي تستدعي طريقة AWAIT () ستستمر في حظر وانتظار قيمة كائن العد التنازلي إلى 0.
قائمة وظائف العد التنازلي
يقوم CountDownlatch (COUNT) بإنشاء خطوط العد التنازلية التي تم تهيئتها مع عدد معين. // اجعل الخيط الحالي انتظر حتى يتم احتساب المزلاج إلى الصفر ، ما لم يتم مقاطعة الخيط. void await () // يجعل مؤشر الترابط الحالي ينتظر حتى يتم احتساب المزلاج إلى الصفر ، ما لم يتم مقاطعة الخيط أو تجاوز وقت الانتظار المحدد. المنطقية في انتظار (فترة طويلة ، وحدة الوقت) // انخفاض عدد المزلاج. إذا وصل العد إلى الصفر ، فسيتم إصدار جميع خيوط الانتظار. العد التنازلي void () // إرجاع العدد الحالي. long getCount () // إرجاع سلسلة تحدد هذه المزلاج وحالتها. سلسلة tostring ()
بنية بيانات العد التنازلي
مخطط فئة UML من CountDownlatch هو كما يلي:
بنية بيانات CountDownlatch بسيطة ، يتم تنفيذها من خلال "الأقفال المشتركة". أنه يحتوي على كائنات المزامنة ، المزامنة هي نوع المزامنة. Sync هي فئة مثيل ، والتي ترث من AQS.
مثال على CountDownlatch
يتم تنفيذ ما يلي من خلال CountDownlatch: "الخيط الرئيسي" ينتظر "5 خيوط الطفل" لإكمال "العمل المحدد (1000ms)" قبل الاستمرار في التشغيل.
استيراد java.util.concurrent.countdownlatch ؛ import java.util.concurrent.cyclicbarrier ؛ public countdownlatchtest1 {private static int watch_size = 5 ؛ خاص ثابت العد التنازلي Donesignal ؛ public static void main (string [] args) {try {donesignal = new CountDownLatch (latch_size) ؛ // إنشاء 5 مهام جديدة لـ (int i = 0 ؛ i <latch_size ؛ i ++) new InnerThRead (). start () ؛ system.out.println ("Main في انتظار البداية.") ؛ // "الخيط الرئيسي" ينتظر الانتهاء من 5 مهام في تجمع الخيوط لإكمال donesignal.await () ؛ System.out.println ("انتهى الانتظار الرئيسي.") ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} static class innerthread يمتد مؤشر الترابط {public void run () {try {thread.sleep (1000) ؛ System.out.println (thread.currentThRead (). getName () + "Sleep 1000ms.") ؛ // طرح قيمة countDownLatch بواسطة 1 donesignal.countdown () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }}}} نتائج التشغيل:
Main في انتظار البداية.
وصف النتيجة: يستخدم الخيط الرئيسي donesignal.await () لانتظار مؤشرات الترابط الأخرى لتخفيض donesignal إلى 0. الخيوط الداخلية الخمسة الأخرى ، كل واحد منهم يطرح قيمة donesignal من قبل 1 إلى donesignal.countdown () ؛ عندما يكون Donesignal 0 ، سيستمر Main في التنفيذ بعد الاستيقاظ.
ملاحظة: الفرق بين CountDownlatch و Cyclicbarrier:
(1) تتمثل وظيفة CountDownlatch في السماح لما يسلل 1 أو N بانتظار مؤشرات الترابط الأخرى لإكمال التنفيذ ؛ بينما يتيح Cyclicbarrier أن تنتظر Thoulds لبعضها البعض.
(2) لا يمكن إعادة تعيين عداد CountDownlatch ؛ يمكن استخدام عداد Cyclicbarrier بعد إعادة التعيين ، لذلك يطلق عليه حاجز حلقة.