تعليمات CountDownlatch هي للرجوع إليها. المحتوى المحدد كما يلي
CountDownlatch عبارة عن فئة أداة التزامن التالية Java.Util.Util.Current تتيح للانتظار واحد أو أكثر من مؤشرات الترابط حتى يتم إكمال مجموعة من العمليات في مؤشرات الترابط الأخرى.
استخدام CountDownlatch بسيط للغاية. المثال التالي هو أيضًا ما رأيته عبر الإنترنت ، وهو مناسب جدًا. سوف أنشرها هنا.
اختبار الفئة العامة {public static void main (string [] args) {countDownLatch begin = new CountDownLatch (1) ؛ CountDownLatch End = New CountDownLatch (2) ؛ لـ (int i = 0 ؛ i <2 ؛ i ++) {thread thread = new thread (new player (start ، end)) ؛ thread.start () ؛ } حاول {system.out.println ("The Race Begin") ؛ begin.countdown () ؛ end.await () ؛ System.out.println ("The Race End") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}/*** player*/player class ينفذ Runnable {private countdownlatch start ؛ نهاية العد التنازلي نهاية. Player (CountDownLatch Begin ، CountDownLatch End) {this.begin = start ؛ this.end = نهاية ؛ } public void run () {try {begin.await () ؛ System.out.println (thread.currentThRead (). getName () + "وصل!") ؛؛ end.countdown () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }}}فيما يلي نتائج التشغيل
يمكنك أن ترى أنه من خلال استخدام CountDownlatch ، نتحكم في ترتيب تنفيذ مؤشرات الترابط.
في الكود أعلاه ، نستخدم طريقة AWAIT () وطريقة العد التنازلي (). دعونا نتحقق من وظائفهم.
أولا تحقق من طريقة AWAIT (). التعليق على end.await () في الطريقة الرئيسية. فيما يلي نتيجة التشغيل بعد التعليق.
يمكنك أن ترى أن الخيط الرئيسي لم ينتظر أن ينتهي الخيط الذي يمثل المتسابق ، وأعلن بشكل مباشر أن المنافسة قد انتهت! اللعبة التي انتهت في البداية ---
يمكن أن نرى هنا أن طريقة AWAIT () لها تأثير حظر
ثانياً ، دعنا نتحقق من طريقة العد التنازلي ، والتعليق على end.countdown () في موضوع المتسابق. فيما يلي نتيجة التشغيل.
تم تشغيل البرنامج ، وقد وصل جميع اللاعبين إلى خط النهاية ، لكن الحكم لا يعزز نهاية اللعبة. ماذا ينتظر؟
نعتقد أن طريقة العد التنازلي () لها تأثير على استيقاظ موضوع الحظر.
ثم قد نسأل ، نظرًا لأنه يحتوي على وظيفة استيقاظ خيط الحظر ، أليس من الممكن إيقاظ الخيط الرئيسي المحظور إذا اتصلنا فقط بطريقة العد التنازلي () مرة واحدة؟
دعنا نجرب ذلك ، إلغاء التعليق التوضيحي أعلاه CoutDown () ، إنشاء لاعب مرة أخرى ، الرمز كما يلي
ينفذ Player2 Class Runnable {private countdownlatch begin ؛ نهاية العد التنازلي نهاية. player2 (CountDownLatch start ، CountDownLatch End) {this.begin = start ؛ this.end = نهاية ؛ } public void run () {try {begin.await () ؛ System.out.println (thread.currentThRead (). getName () + "وصل!") ؛ // end.countdown () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }}}يتم تعديل الطريقة الرئيسية أيضًا على النحو التالي ، مما يؤدي إلى إنشاء لاعبين مختلفين
الفراغ الثابت العام (سلسلة [] args) {countDownLatch begin = new CountDownLatch (1) ؛ CountDownLatch End = New CountDownLatch (2) ؛ موضوع الموضوع = مؤشر ترابط جديد (لاعب جديد (بداية ، نهاية)) ؛ thread.start () ؛ Thread Thread2 = مؤشر ترابط جديد (New Player2 (start ، end)) ؛ thread2.start () ؛ حاول {system.out.println ("The Race Begin") ؛ begin.countdown () ؛ end.await () ؛ System.out.println ("The Race End") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}قم بتشغيله ، ها هي النتائج
تم حظر البرنامج الرئيسي ولم يوقظ. كان الحكم يستخدم المرحاض لفترة من الوقت!
يبدو أن العد التنازلي () لا يستيقظ مباشرة الخيط ، إنه يشبه العد التنازلي.
تحقق من وثائق API ، بالتأكيد بما فيه الكفاية ، أضفنا المعلمة 2 إلى المُنشئ ، ونحن بحاجة إلى استدعاء العد التنازلي () مرتين لإيقاظ موضوع end.await ().
CountDownLatch End = New CountDownLatch (2) ؛
لتلخيص،
1. CountDownlatch End = New CountDownLatch (N) ؛ // عند إنشاء كائن ، تحتاج إلى تمرير في المعلمة N.
2. end.await () يمكن منع المواضيع حتى تسمى طريقة end.countdown () n مرات قبل إصدار الخيط.
3. يمكن استدعاء end.countdown () في مؤشرات ترابط متعددة لحساب عدد المكالمات التي هي مجموع جميع مؤشرات الترابط.
في المدونة التالية ، سأشرح كيف يعمل CountDownlatch من مستوى التعليمات البرمجية المصدر.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.