【发布时间】:2014-04-12 02:59:39
【问题描述】:
我正在阅读 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;
}
}
这是它的解释:
清单 5.11 中的TestHarness 说明了闩锁的两种常见用途。 TestHarness 创建多个运行给定任务的线程 同时。它使用两个闩锁,一个“起始门”和一个“结束门” 门”。起始门初始化为计数为 1; 结束门被初始化为计数等于工人的数量 线程。每个工作线程做的第一件事就是等待 起跑门;这确保了它们都不会开始工作,直到 他们都准备好开始了。每个人做的最后一件事就是倒计时 在终点门上;这允许主线程有效地等待 直到最后一个工作线程完成,所以它可以 计算经过的时间。
我是 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;
请帮助我理解这个概念。
【问题讨论】:
-
如果你不知道多线程是如何工作的,为什么要从
CountDownLatch开始呢?慢下来。开始here。 -
@SotiriosDelimanolis,我正在使用这本书学习多线程概念,因为这是许多 SO 专家的建议。但是我很难理解这个例子。
-
本书不应该用作多线程的介绍,您可以在如何使用本书部分清楚地阅读。然后,同一部分列出了建议的介绍性资源。
-
启动线程需要时间。因此,如果每个线程在启动后立即执行其任务,则一些线程可能已经在运行,而另一些则尚未创建。所以他们使用闩锁等待,直到主线程发出启动信号。就像在真正的跑步比赛中一样。当他们完成他们的任务时,他们会发出信号,这样主线程就可以知道他们什么时候都完成了。
-
图片赛马比赛直到所有马都在起跑线上才开始,直到最后一匹到达终点线才结束。
标签: java multithreading concurrency