https://www.cnblogs.com/gustavo

Gustavo's Blog

人类的赞歌是勇气的赞歌!

CountDownLatch

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("主线程执行");

}

posted @ 2022-08-20 15:11  BitBean  阅读(40)  评论(0编辑  收藏  举报