CountDownLatch
- CountDownLatch 是一种通用的同步工具CountDownLatch内部的实现主要是依靠AQS的共享模式。
- 当一个线程把CountDownLatch初始化了一个count之后,其他的线程调用await就会阻塞住,直到其他的线程一个一个调用countDown方法进行release操作,把count的值减到0,即把同步锁释放掉,await才会进行下去。比如有一个主线程A,它要等待其他4个子线程执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
- 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行。
- CountDownLatch通过AQS(AbstractQueuedSynchronizer)里面的共享锁来实现的。
属性
CountDownLatch是通过AbstractQueuedSynchronizer的实现类Sync进行实现
private final Sync sync;
构造函数
//传入count计数值构造CountDownLatch实例 public CountDownLatch(int count) { //如果count小于0,抛出IllegalArgumentException异常 if (count < 0) throw new IllegalArgumentException("count < 0"); //调用上面的介绍的Sync的构造函数,将计数值count设置为sync从AQS继承下来的state属性,不清楚的可以看下上面对Sync的介绍 this.sync = new Sync(count); } |
主要方法
//等待,直到count到0再执行,或者线程被中断 public void await() throws InterruptedException { //调用sync的acquireSharedInterruptibly方法进入等待 sync.acquireSharedInterruptibly(1); } //设置超时时间的等待 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { //调用sync的tryAcquireSharedNanos方法进入等待 return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); } //count 减1 public void countDown() { //调用sync的releaseShared方法 sync.releaseShared(1); } //获取count public long getCount() { //调用sync的getCount return sync.getCount(); } |
使用
public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(() -> { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子线程执行"); latch.countDown(); }).start(); } latch.await(); System.out.println("主线程执行"); } |