CountDownLatch是Java中的一个并发工具类。
它主要用于协调多个线程之间的同步。可以把它想象成一个倒计时器。
比如有一个任务需要等待多个子任务都完成后才能继续进行,CountDownLatch就能派上用场。
构造CountDownLatch时需要传入一个整数作为计数器的初始值。当一个子任务完成时,就调用countDown方法,这个方法会将计数器的值减1。其他线程可以调用await方法,这个线程就会阻塞等待,直到计数器的值变为0。例如,假设有一个主线程需要等待10个工作线程全部完成任务后再汇总结果,就可以用CountDownLatch,初始值设为10,每个工作线程完成任务后调用countDown,主线程调用await等待所有工作线程完成。
在Java中使用CountDownLatch
的基本步骤:
-
导入相关包:
import java.util.concurrent.CountDownLatch;
-
创建CountDownLatch实例:在主线程或者控制线程中,通过
CountDownLatch latch = new CountDownLatch(n);
来创建,其中n
是需要等待的事件数量,比如等待n
个线程完成任务,n
就代表线程的数量。 -
在线程任务中使用:在每个需要同步的线程任务里,当任务完成后调用
latch.countDown();
,这会将CountDownLatch
的计数器减1。 -
等待所有任务完成:在主线程(或控制线程)中,通过
latch.await();
来阻塞当前线程,直到计数器归零,即所有任务都完成。
下面是一个简单示例:
import java.util.concurrent.CountDownLatch;class Worker implements Runnable {private final CountDownLatch latch;public Worker(CountDownLatch latch) {this.latch = latch;}@Overridepublic void run() {try {// 模拟线程执行任务Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + " completed");} catch (InterruptedException e) {e.printStackTrace();} finally {// 任务完成,计数器减1latch.countDown();}}
}public class Main {public static void main(String[] args) {int numWorkers = 5;// 创建CountDownLatch,初始值为5CountDownLatch latch = new CountDownLatch(numWorkers);for (int i = 0; i < numWorkers; i++) {Thread workerThread = new Thread(new Worker(latch), "Worker-" + i);workerThread.start();}try {// 等待所有线程完成任务latch.await();System.out.println("All workers have completed");} catch (InterruptedException e) {e.printStackTrace();}}
}
在这个示例中,有5个工作线程,CountDownLatch
的初始值设为5。每个工作线程完成任务后调用countDown
方法,主线程调用await
方法等待所有工作线程完成任务,当所有工作线程完成任务后,主线程才会继续执行打印语句。