CountDownLatch是Java中的一個并發工具類,用于實現線程等待的功能。它可以讓一個或多個線程等待其他線程的操作完成后再繼續執行。
CountDownLatch使用一個計數器來實現等待。計數器的初始值可以設置為一個正整數,當一個線程執行完自己的任務后,計數器的值減1。當計數器的值變為0時,所有等待的線程將被釋放,可以繼續執行。
CountDownLatch的主要方法包括:
CountDownLatch(int count)
:構造方法,設置計數器的初始值。void await()
:使當前線程等待,直到計數器的值變為0。void countDown()
:計數器的值減1。下面是一個使用CountDownLatch的示例:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3); // 設置計數器的初始值為3
Worker worker1 = new Worker(latch, "Worker1");
Worker worker2 = new Worker(latch, "Worker2");
Worker worker3 = new Worker(latch, "Worker3");
worker1.start();
worker2.start();
worker3.start();
latch.await(); // 等待所有線程執行完畢
System.out.println("All workers have finished their tasks.");
}
}
class Worker extends Thread {
private CountDownLatch latch;
public Worker(CountDownLatch latch, String name) {
super(name);
this.latch = latch;
}
public void run() {
try {
Thread.sleep(1000); // 模擬任務執行時間
System.out.println(getName() + " has finished its task.");
latch.countDown(); // 計數器的值減1
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我們創建了一個CountDownLatch對象,并將其初始值設置為3。然后創建了三個Worker線程,并讓它們執行任務。每個Worker線程執行完任務后,都會調用countDown()
方法將計數器的值減1。主線程調用await()
方法等待計數器的值變為0,即所有Worker線程都執行完任務后,主線程才會繼續執行。
注意:CountDownLatch的計數器是一次性的,一旦計數器的值變為0,就無法重置為其他值。如果需要多次使用計數器,可以考慮使用CyclicBarrier類。