القفل يعادل الباب. قبل أن يصل القفل إلى الحالة النهائية، يكون الباب مغلقًا دائمًا ولا يمكن لأي خيط المرور. عند الوصول إلى الحالة النهائية، سيفتح الباب ويسمح لجميع الخيوط بالمرور. يمكن أن يجعل مؤشر ترابط واحد أو أكثر ينتظر حدوث مجموعة من الأحداث. تتكون حالة الإغلاق من عداد، تمت تهيئته برقم رسمي إيجابي يشير إلى عدد الأحداث التي يجب انتظارها. تقوم طريقة العد التنازلي بتقليل العداد، مما يشير إلى وقوع حدث ما، بينما تنتظر طريقة الانتظار وصول العداد إلى 0، مما يشير إلى وقوع الحدث المنتظر. يؤكد CountDownLatch على أن مؤشر ترابط واحد (أو سلاسل رسائل متعددة) يحتاج إلى الانتظار حتى تكمل سلاسل الرسائل n الأخرى شيئًا ما قبل متابعة التنفيذ.
تطبيق السيناريو:
10 رياضيين يستعدون للجري وينتظرون أمر الحكم ويبدأون بالجري في نفس الوقت. عندما يتجاوز آخر شخص خط النهاية، تنتهي اللعبة. 10 حركات تعادل 10 خيوط. المفتاح هنا هو التحكم في 10 خيوط لتشغيلها في نفس الوقت، وكيفية تحديد متى يصل الخيط الأخير إلى نقطة النهاية. يمكن استخدام قفلين، يستخدم القفل الأول للتحكم في 10 خيوط تنتظر أمر الحكم، والقفل الثاني يتحكم في نهاية اللعبة.
import java.util.concurrent.CountDownLatch; class Aworker Implements Runnable { public CountDownLatch begin; public Aworker(int num, Final CountDownLatch end) { this.num = this.begin = begin; this.end = end; } @Override public void run() { // TODO Auto-generated way stub Try { System.out.println(num + "الأشخاص جاهزون"); begin.await(); // جاهز} Catch (InterruptedException e) { e.printStackTrace(); } أخيرا { end.countDown(); يتناقص العداد بمقدار واحد ويصل إلى نقطة النهاية System.out.println(num + "وصول الأشخاص"); } }} public class Race { public static void main(String[] args) { int num = 10; CountDownLatch begin = new CountDownLatch(1); New CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, begin, end)).start() } حاول { Thread.sleep((long) (Math.random() * 5000) } Catch (InterruptedException e1) { // TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا e1.printStackTrace(); } System.out.println("يقول القاضي: run!"); ); حاول { end.await(); // انتظر النهاية} Catch (InterruptedException e) { // كتلة التقاط TODO التي تم إنشاؤها تلقائيًا e.printStackTrace(); } أخيرًا { long endTime = System.nanoTime(); System.out.println("يقول القاضي: وصل الجميع!");
الإخراج
الشعب الأول جاهزالشعب الثاني جاهزالشعب الرابع جاهزالشعب السادس جاهزالشعب الثالث جاهزالشعب العاشر جاهزالشعب الثامن جاهزالشعب الخامس جاهزالشعب السابع جاهزالشعب التاسع جاهز يقول القاضي : اركض! يصل الشعب الأوليصل الرابعيصل العاشريصل الشعب الخامسيقول القاضي : وصل الجميع !وصول الأشخاص التاسع وصول الأشخاص السابع وصول الأشخاص الثامن وصول الأشخاص الثالث وصول الأشخاص السادس وصول الأشخاص السادس في نهاية الوقت: 970933