נעשה שימוש ב-CountDownLatch כדי לוודא שמשימה ממתינה לשרשורים אחרים לפני שהיא מתחילה. כדי להבין את היישום שלו, הבה נבחן שרת שבו המשימה העיקרית יכולה להתחיל רק כאשר כל השירותים הנדרשים התחילו. עבודה של CountDownLatch: כאשר אנו יוצרים אובייקט של CountDownLatch אנו מציינים את מספר השרשורים שעליו להמתין עד שכל השרשורים הללו נדרשים לבצע ספירה לאחור על ידי קריאה ל- CountDownLatch.countDown() לאחר שהם הושלמו או מוכנים לעבודה. ברגע שהספירה מגיעה לאפס, משימת ההמתנה מתחילה לרוץ. דוגמה ל-CountDownLatch ב-JAVA: Java // Java Program to demonstrate how // to use CountDownLatch Its used // when a thread needs to wait for other // threads before starting its work. import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String args[]) throws InterruptedException { // Let us create task that is going to // wait for four threads before it starts CountDownLatch latch = new CountDownLatch(4); // Let us create four worker // threads and start them. Worker first = new Worker(1000 latch 'WORKER-1'); Worker second = new Worker(2000 latch 'WORKER-2'); Worker third = new Worker(3000 latch 'WORKER-3'); Worker fourth = new Worker(4000 latch 'WORKER-4'); first.start(); second.start(); third.start(); fourth.start(); // The main task waits for four threads latch.await(); // Main thread has started System.out.println(Thread.currentThread().getName() + ' has finished'); } } // A class to represent threads for which // the main thread waits. class Worker extends Thread { private int delay; private CountDownLatch latch; public Worker(int delay CountDownLatch latch String name) { super(name); this.delay = delay; this.latch = latch; } @Override public void run() { try { Thread.sleep(delay); latch.countDown(); System.out.println(Thread.currentThread().getName() + ' finished'); } catch (InterruptedException e) { e.printStackTrace(); } } } תְפוּקָה: WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished
עובדות על CountDownLatch: - יצירת אובייקט של CountDownLatch על ידי העברת int לבנאי שלו (הספירה) היא למעשה מספר הצדדים המוזמנים (שרשורים) לאירוע.
- השרשור התלוי בשרשורים אחרים כדי להתחיל בעיבוד ממתין עד שכל שרשור אחר יקרא ספירה לאחור. כל השרשורים שמחכים ל-await() ממשיכים יחד ברגע שהספירה לאחור מגיעה לאפס.
- שיטת countDown() מפחיתה את חסימות שיטת ה-count ו-await() עד count == 0