一、代码使用样例
通过CountDownLatch实现:"主线程"等待"5个子线程"全部都完成"指定的工作(休眠1000ms)"之后,再继续运行。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
private static CountDownLatch latch = new CountDownLatch(5);
public static void main(String[] args) {
System.out.println("Main Thread start....");
System.out.println();
for (int i = 0; i < 5; i++) {
new InnerThread().start();
}
try {
latch.await();
System.out.println();
System.out.println("Main Thread latch.getCount = " + latch.getCount());
} catch (InterruptedException e) {
System.out.println("Exception happened in latch await: " + e);
}
System.out.println("Main Thread end....");
}
static class InnerThread extends Thread {
public void run() {
synchronized (InnerThread.class) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " sleep 1000 ms.");
// 将CountDownLatch的数值减1
latch.countDown();
System.out.println(Thread.currentThread().getName() + " count number: " + latch.getCount());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
执行结果: 主线程等待,直至 latch 通过 countDown 减为0后,主线程才继续执行。
Main Thread start....
Thread-1 sleep 1000 ms.
Thread-1 count number: 4
Thread-4 sleep 1000 ms.
Thread-4 count number: 3
Thread-0 sleep 1000 ms.
Thread-0 count number: 2
Thread-3 sleep 1000 ms.
Thread-3 count number: 1
Thread-2 sleep 1000 ms.
Thread-2 count number: 0
Main Thread latch.getCount = 0
Main Thread end....
二、常用方法解读
// 构造一个用给定计数初始化的 CountDownLatch。 CountDownLatch(int count) // 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。 void await() // 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。 boolean await(long timeout, TimeUnit unit) // 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 void countDown() // 返回当前计数。 long getCount() // 返回标识此锁存器及其状态的字符串。 String toString()
三、源码解读
可以看出countDownLatch内部实现通过继承自AQS的Sync对象来实现。

构造方法:

countDown等方法均与Sync类定义有关

