给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
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()得到当前计数器的值。