CountDownLatch trong Java

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

https://www.geeksforgeeks.org/countdownlatch-in-java/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x