1、闭锁<p>闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能够通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会在改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行。</p><p> </p><p>CountDownLatch是一种灵活的闭锁实现,可以在上述各种情况中使用,它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器 ,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件已经发生了,而await方法等待计数器达到零,这表示所有需要等待的事件都已经发生。如果计数器的值非零,那么await会一直阻塞直到计数器为零,或者等待中的线程中断,或者等待超时。</p>
package www.klshiguang.concurrent;
import java.util.concurrent.CountDownLatch;
/**
* @author Administrator
* 在计时测试中使用CountDownLatch来启动和停止数据
*/
public class TestHarness {
public long timeTasks(int nThreads,final Runnable task) throws InterruptedException{
final CountDownLatch startGate = new CountDownLatch(1);
final CountDownLatch endGate = new CountDownLatch(nThreads);
for(int i = 0;i < nThreads;i++){
Thread t = new Thread(){
public void run(){
try {
startGate.await();
try {
task.run();
} finally{
endGate.countDown();
}
} catch (InterruptedException e) {
}
}
};
t.start();
}
long start = System.nanoTime();
startGate.countDown();
long end = System.nanoTime();
return end - start;
}
public static void main(String[] args) {
TestHarness harness = new TestHarness();
Thread task = new Thread(){
public void run(){
for(int i = 0;i < 1000;i++){
System.out.println(this.getName() + i);
}
}
};
try {
harness.timeTasks(6, task);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}