CountDownLatch底层实现也是基于一个静态类Sync,是AQS的子类。
一个实例只能使用一次!
核心方法:
1.CountDownLatch(int count):底层调用Sync(int count), 本质是将AQS的state设置为count。
2.await(): 底层调用AQS的acquireSharedInterruptibly(1)方法,将线程加入到AQS的等待队列的队尾,如果state已减为0,则什么都不做。
3.countDown():调用AQS的releaseShared()方法,会先调用tryReleaseShared()方法,将state减1,若减完后,state等于0,则返回true,否则返回false。若返回true,则表示CountDownLatch倒计时结束,将AQS等待队列中的所有线程全部唤醒。
使用样例1:
class Driver {
// ...
void main() 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();
doSomethingElse(); // don't let run yet
startSignal.countDown(); // let all threads proceed
doSomethingElse();
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();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {}
// return;
}
void doWork() { ... }
}
class Driver2 { // ...
void main() throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(N);
Executor e = ...
for (int i = 0; i < N; ++i) // create and start threads
e.execute(new WorkerRunnable(doneSignal, i));
doneSignal.await();
// wait for all to finish
}
}
class WorkerRunnable implements Runnable {
private final CountDownLatch doneSignal;
private final int i;
WorkerRunnable(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}
public void run() {
try {
doWork(i);
doneSignal.countDown();
} catch (InterruptedException ex) {}
// return;
}
void doWork() { ... }