我正在阅读《 Java Concurrency In Practice》一书,并遇到了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 ignored) { }
}
};
t.start();
}
long start = System.nanoTime();
startGate.countDown();
endGate.await();
long end = System.nanoTime();
return end-start;
}
}
这是它的解释:
我是Java多线程的新手,所以我无法理解给出的解释以及该程序的工作方式。
这是什么意思-
以及这段代码是如何工作的:
Thread t = new Thread() {
public void run() {
try {
startGate.await();
try {
task.run();
} finally {
endGate.countDown();
}
} catch (InterruptedException ignored) { }
}
};
和
long start = System.nanoTime();
startGate.countDown();
endGate.await();
long end = System.nanoTime();
return end-start;
请帮助我理解这个概念。
最佳答案
这段代码
Thread t = new Thread() {
public void run() {
try {
startGate.await();
try {
task.run();
} finally {
endGate.countDown();
}
} catch (InterruptedException ignored) { }
}
};
设置所有需要的线程。每个线程将等待
startGate
被“打开”,即。当线程完成执行Runnable
时,即它的计数变为0。 run()
返回,他们将倒数endGate
。那就是这个方法。
设置所有线程后,将执行此代码。
long start = System.nanoTime();
startGate.countDown();
endGate.await();
long end = System.nanoTime();
return end-start;
当前线程递减
startGate
,这允许所有其他线程开始执行其Runnable
,即。 task.run()
。然后,它等待endGate
上的(块)计数为0。这时,它将计算花费的时间并返回该值。那就是这个方法