一种同步工具类,可以延迟线程的进度直到闭锁的值等于0(终止状态)
可用于在执行一个任务前,必须把这个任务前的全部完成,才能执行这个任务。
比如,游戏要等所有玩家都准备好之后才开始 所有资源都初始化之后才开始加载类。
t.start();启动线程后继续向下执行,不过线程会在startGate.await();的地方等待
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闭锁等于0
startGate.await();
try {
//虽然是实现了runnable 不过task.run()不会启动线程 和执行普通方法一样
task.run();
} finally {
//每一个线程执行任务之后,countdown
endGate.countDown();
}
} catch (InterruptedException ignored) {
}
}
};
t.start();
}
long start = System.nanoTime();
//打开闭锁 startGate
startGate.countDown();
//等待endGate闭锁等0之后,继续向下执行
endGate.await();
long end = System.nanoTime();
return end - start;
}