我正在阅读《 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。这时,它将计算花费的时间并返回该值。那就是这个



方法

10-06 09:10