1. Description
A java.util.concurrent.CountDownLatch is a concurrency construct that allows one or more threads to wait for a given set of operations to complete.
A CountDownLatch is a versatile synchronization tool and can be used for a number of purposes. A CountDownLatch initialized with a count of one serves as a simple on/off latch, or gate: all threads invoking await wait at the gate until it is opened by a thread invoking countDown(). A CountDownLatch initialized to N can be used to make one thread wait until N threads have completed some action, or some action has been completed N times
3. Its methods
void |
await()
Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted . |
boolean |
await(long timeout, TimeUnit unit)
Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted , or the specified waiting time elapses. |
void |
countDown()
Decrements the count of the latch, releasing all waiting threads if the count reaches zero. |
long |
getCount()
Returns the current count. |
String |
toString()
Returns a string identifying this latch, as well as its state. |
3.Sample usage:
*The first is a start signal that prevents any worker from proceeding until the driver is ready for them to proceed;
*The second is a completion signal that allows the driver to wait until all workers have completed.

class Driver
{

public static void main(String[] args) throws InterruptedException
{
final int N = 3;
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N);

for (int i = 0; i < N; ++i)
new Thread(new Worker(startSignal, doneSignal)).start(); // create and start threads

doSomethingElse(); // don't let run yet
startSignal.countDown(); // let all threads proceed
doSomethingElse();
doneSignal.await(); // wait for all to finish
System.out.println("Diver has waited for all workers\' work completed");
}


private static void doSomethingElse()
{
System.out.println("Driver is doing sth. else");
}
}


class Worker implements Runnable
{
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;


Worker(CountDownLatch startSignal, CountDownLatch doneSignal)
{
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}


public void run()
{

try
{
startSignal.await();
doWork();
doneSignal.countDown();
System.out.println("done signal, count is " + doneSignal.getCount());

} catch (InterruptedException ex)
{
} // return;
}


private void doWork()
{
System.out.println("Worker is doing his work");
}
}
4. Reference
api:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html