CountDownLatch được sử dụng để đảm bảo rằng một tác vụ đợi các luồng khác trước khi nó bắt đầu. Để hiểu ứng dụng của nó, chúng ta hãy xem xét một server mà tác vụ chính của nó chỉ có thể bắt đầu khi các service cần thiết của nó khởi chạy.
CountDownLatch trong Java
Khi chúng ta tạo một đối tượng CountDownLatch chúng ta sẽ chỉ định số lượng thread mà nó sẽ chờ, mỗi thread được chờ phải gọi CountDownLatch.countDown() method để thông báo rằng nó đã thực thi xong. Ngay sau khi số lượng thread được trở về 0, tác vụ chính sẽ được chạy.
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(); } } }
Output
WORKER-1 finished WORKER-2 finished WORKER-3 finished WORKER-4 finished main has finished
Một số điểm cần lưu ý là việc khởi tạo CountDownLatch object nhận vào một số nguyên là số lượng các thread sẽ phải chờ cho đến khi tác vụ chính được thực hiện.
Một thread, phụ thuộc vào các thread khác để bắt đầu xử lý, đợi cho đến khi mọi thread khác được gọ. Tất cả các thread đang chờ sau hàm await () sẽ tiến hành cùng nhau khi quá trình đếm ngược đạt đến 0.
Phương thức countDown () giảm khối lượng phương thức count và await () cho đến khi count == 0.
Nguồn tham khảo