给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.htmlhtml
Java中concurrent包中的CountDownLatch类说白了就是一个计数器,咱们能够经过设置参数来进行计数,每次只能有一个线程去操做这个计数器,经过CountDown这个函数使得计数器的值减少,当计数器的值为0时,阻塞于await方法的线程才能得以执行。java
例子:下面的程序中的主线程阻塞于await方法, 只有当5个线程都执行完了,主线程才能继续执行。api
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类中有如下几个方法oracle
void await()等待,直到计数器中的值减为0。
boolean await(long timeout, TimeUnit unit)能够本身设置超时时间,一旦超过这个时间,await线程被唤醒,若是返回true,说明计数器为0,不然,不为0。
void countDown()使得计数器的值减1。
long getCount()获得当前计数器的值。