java.util.concurrent并发工具类:等待多线程完成的CountDownLatch

10 篇文章 2 订阅

首先,介绍的是CountDownLatch是一个同步工具类。在java 1.5时引入 java.util.concurrent并发包,在java并发包中有三个类用于同步一批线程的行为,分别是CountDownLatch、Semaphore和CyclicBarrier;还有一些其它类比喻:ConcurrentMap、BlockingQueue等等。本次介绍CountDownLatch的用处及代码示例来加以理解。

CountDownLatch的简介:允许一个或多个线程一直处于等待状态,直到其它线程操作完成后再执行其它操作。其实,在我们开发中是有这样的应用场景的;也是一个比较常见的一个面试题。举例:比喻我们要去外地游玩,首先我们得先做好一切准备;收拾衣物、购生活用品、购车票以上三种我们都准备好之后才能出发。简单介绍一下基本概念:

CountDownLatch的原理很简单可以看成一个倒计数器来实现的,使用构造方法传递初始值,计数器的初始值为线程的数量。每当一个线程完成了调用countdown()方法后,计数器的值就会减1。await()方法会等待倒计数器变为0时,它表示所有的线程已经完成了自己的操作,然后在闭锁上等待的线程就可以恢复执行任务。我们用代码来简单的实现一下,如下:

public static void main(String[] args) {
        Executor executor = Executors.newFixedThreadPool(3);
        final CountDownLatch count = new CountDownLatch(3);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("收拾衣服!");
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    if(count != null){
                        count.countDown();
                    }
                }
            }
        });
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("购生活用品!");
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    if(count != null){
                        count.countDown();
                    }
                }
            }
        });
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("购车票!");
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    if(count != null){
                        count.countDown();
                    }
                }
            }
        });


        try {
            count.await();
            System.out.println("出发!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

从以上代码我们可以看出,CountDownLatch的主要方法如下:

await(); // 当前线程在锁存器倒计数至零之前一直处于等待状态。若等待期间该线程被中断,则抛出InterruptedException并清除该线程的中断状态。

countDown(); // 递减锁存器的计数,如果计数到达零,则释放所有await();等待的线程。若当前值为1,则调用该方法将置为0,并唤醒所有await等待的线程;若当前值等于0,则什么也不做。

await(long timeout, TimeUnit unit); 在指定的时间内等待计数器的值为0,若在指定时间内计数器的值变为0,则该方法返回true;若指定时间内计数器的值仍未变为0,则返回false;若指定时间内计数器的值变为0之前当前线程被中断,则抛出InterruptedException并清除该线程的中断状态。

getCount(); 读取当前计数器的值,一般用于调试或者测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值