CountDownLatch是一个灵活的闭锁的实现,他可以使一个或者多个线程等待一组事件发生。闭锁状态包括一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件发生了。而await方法等到计数器达到0,表示所有需要等待的事件都已经发生。如果一个计数器值不为0,那么await会一直阻塞到计数器为零,或者等待中的线程中断,或者等待超时。
public class TestHarness {
public long timeTasks(int nThreads,final Runnable task)throws Exception{
final CountDownLatch startGate=new CountDownLatch(1);
final CountDownLatch endGate=new CountDownLatch(nThreads);
for (int i=0;i<nThreads;i++){
Thread t=new Thread(){
@Override
public void run() {
startGate.await();
try {
task.run();
}catch (Exception e){
e.printStackTrace();
}finally
{
endGate.countDown();
}
}
};
}
long start=System.nanoTime();
startGate.countDown();
endGate.await();
long end=System.nanoTime();
return end-start;
}
}
上述代码,TestHarness 创建一定数量的线程,利用他们并发的执行任务,使用两个闭锁,分别表示“起始门(StartGate) 结束门(endgate)”,起始门初始值为1,结束门初始值为工作线程的数量,每个工作线程首先要做的值就是启动门上等待,从而保证所有线程都就绪后才开始执行。而每个线程要做的最后一件事就是将调用结束门的countdow方法减一。