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类。