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的数,将countsyncAQS承下来的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("主线行");

}