先来一段 jdk 的示例:
public class Countdownlatch_Test { private final static int N = 3; public static void main(String[] args) throws InterruptedException { CountDownLatch startSignal = new CountDownLatch(1); CountDownLatch doneSignal = new CountDownLatch(N); for (int i = 0; i < N; ++i) // create and start threads new Thread(new Worker(startSignal, doneSignal)).start(); System.out.println("main start"); // don't let run yet startSignal.countDown(); // let all threads proceed System.out.println("child start"); doneSignal.await(); // wait for all to finish } } class Worker implements Runnable { private final CountDownLatch startSignal; private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { this.startSignal = startSignal; this.doneSignal = doneSignal; } public void run() { try { startSignal.await(); System.out.println(Thread.currentThread().getName()); doneSignal.countDown(); } catch (InterruptedException ex) { } // return; } }
CountDownLatch 的用法很简单,一个线程 await,其他的线程一直 countDown,当计数为 0 时,await 的线程就会运行。
不管是 CountDownLatch 还是 ReentrantLock,底层实现都是 AbstractQueuedSynchronizer,所以重点是这个类。
浙公网安备 33010602011771号