CountDownLatch的简单介绍

原理

CountDownLatch表示计数器,可以给CountDownLatch设置一个数字,调用await()将阻塞线程执行,其他线程可以调用countDown()将CountDownLatch的计数减一,当数字变成0时,所有await的线程都将被唤醒,利用AQS排队,一旦数字减为0,AQS中排队的线程依次唤醒

方法

//初始化计数
public CountDownLatch(int count)

//计数减一
public void countDown()

//阻塞当前线程执行,直到计数为0
public void await() throws InterruptedException

//阻塞当前线程执行,直到计数为0或者到指定时间
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException

测试

	@Test
    public void test10(){
        System.out.println("开始考试");
        new Thread(()->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("同学一考完");
            COUNT_DOWN_LATCH.countDown();//当前线程调用此方法,则基数-1
        }).start();
        new Thread(()->{
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("同学二考完");
            COUNT_DOWN_LATCH.countDown();
        }).start();
        new Thread(()->{
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("同学三考完");
            COUNT_DOWN_LATCH.countDown();
        }).start();
        System.out.println(COUNT_DOWN_LATCH.getCount());
        try {
            //阻塞当前线程执行,直到计数为0
//            COUNT_DOWN_LATCH.await();
            //阻塞当前线程执行,直到到达指定时间
            COUNT_DOWN_LATCH.await(10,TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("全部考完");
    }

你可能感兴趣的:(java,开发语言)