Java中concurrent包中的CountDownLatch类说白了就是一个计数器,我们可以通过设置参数来进行计数,每次只能有一个线程去操作这个计数器,通过CountDown这个函数使得计数器的值减小,当计数器的值为0时,阻塞于await方法的线程才能得以执行。
例子:下面的程序中的主线程阻塞于await方法, 只有当5个线程都执行完了,主线程才能继续执行。
- package com.test;
- import java.util.Random;
- import java.util.concurrent.CountDownLatch;
- public class CountDownLatchDemo {
- private static final int N = 5;
- private CountDownLatch waitCountDownLatch = null;
- public static void main(String[] args) throws InterruptedException {
- new CountDownLatchDemo();
- }
- public CountDownLatchDemo() throws InterruptedException {
- waitCountDownLatch = new CountDownLatch(N);
- for (int i = 0; i < N; ++i) {
- new MyThread(i).start();
- }
- waitCountDownLatch.await();
- System.out.println("所有线程已经执行完成");
- }
- class MyThread extends Thread {
- private int id;
- MyThread(int id) {
- this.id = id;
- }
- public void run() {
- try {
- System.out.println("线程 " + id + "正在执行" );
- Thread.sleep(new Random().nextInt(2) * 1000);
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- } finally {
- waitCountDownLatch.countDown();
- }
- }
- }
- }
注:CountDownLatch类中有以下几个方法
- void await()
等待,直到计数器中的值减为0。
- boolean await(long timeout, TimeUnit unit)
可以自己设置超时时间,一旦超过这个时间,await线程被唤醒,如果返回true,说明计数器为0,否则,不为0。
- void countDown()
使得计数器的值减1。
- long getCount()
得到当前计数器的值。