(十)java多线程之CountDownLatch

本人邮箱: <kco1989@qq.com>
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代码已经所有托管github有须要的同窗自行下载java

引言

有一个同步助手,可让一个或一些线程等待直到另一些线程执行完一些操做.这就是CountDownLatchgit

理论

CountDownLatch在初始化的时候须要一个count参数.调用await()的线程会一直等待,直到其余线程调用countDown使count清空为0.一般全部等待中的线程会被释放而且后面继续调用await的线程会当即返回.这个是一次性操做,count不能被重置的.若是想要被重置的话,就能够参考(九)java多线程之CyclicBarriergithub

  • CountDownLatch(int count) 构造一个指定countCountDownLatch微信

  • await() 若是当前的count为0的话,则会当即返回,不然当前线程一直等待,直到如下状况至少发生一个多线程

    • 其余线程调用countDown使count清空为0dom

    • 当前线程被其余线程中断测试

  • await(long timeout, TimeUnit unit) 若是当前的count为0的话,则会当即返回,不然当前线程一直等待,直到如下状况至少发生一个spa

    • 其余线程调用countDown使count清空为0.net

    • 当前线程被其余线程中断线程

    • 指定的时间超时

  • countDown() 若是当前的count大于0,则count减1,不然,全部等待的线程从新得到执行机会

例子

咱们仍是用上一篇文章旅游作例子吧.小明,小刚,小红','小丽,小黑,小白他们六个最后旅游回来时坐飞机,飞机上就有空姐啦.那么等他们六我的下飞机以后,空姐就要考试清理垃圾啦,检查设备等等,这些事情都必须飞机上的所有乘客下机以后才能作.行,按照这个场景,咱们编写一下程序吧.

  • 首先,想定义一个飞机类 Airplane, 里面包含乘客下机和空姐的清理工做

public class Airplane {
    private CountDownLatch countDownLatch;
    private Random random;
    public Airplane(int peopleNum){
        countDownLatch = new CountDownLatch(peopleNum);
        random = new Random();
    }

    /**
     * 下机
     */
    public void getOffPlane(){
        try {
            String name = Thread.currentThread().getName();
            Thread.sleep(random.nextInt(500));
            System.out.println(name + " 在飞机在休息着....");
            Thread.sleep(random.nextInt(500));
            System.out.println(name + " 下飞机了");
            countDownLatch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void doWork(){
        try {
            String name = Thread.currentThread().getName();
            System.out.println(name + "准备作 清理 工做");
            countDownLatch.await();
            System.out.println("飞机的乘客都下机," + name + "能够开始作 清理 工做");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
  • 最后,就能够直接写测试类

public class TestMain {

    public static void main(String[] args) {
        String visitor = "明刚红丽黑白";
        String kongjie = "美惠花";

        Airplane airplane = new Airplane(visitor.length());
        Set<Thread> threads = new HashSet<>();
        for (int i = 0; i < visitor.length(); i ++){
            threads.add(new Thread(() -> {
                airplane.getOffPlane();
            }, "小" + visitor.charAt(i)));
        }
        for (int i = 0; i < kongjie.length(); i ++){
            threads.add(new Thread(() ->{
                airplane.doWork();
            }, "小" + kongjie.charAt(i) + "空姐"));
        }

        for (Thread thread : threads){
            thread.start();
        }
    }
}

运行一下结果:

小花空姐准备作 清理 工做
小惠空姐准备作 清理 工做
小美空姐准备作 清理 工做
小丽 在飞机在休息着....
小明 在飞机在休息着....
小白 在飞机在休息着....
小刚 在飞机在休息着....
小刚 下飞机了
小明 下飞机了
小黑 在飞机在休息着....
小丽 下飞机了
小红 在飞机在休息着....
小红 下飞机了
小白 下飞机了
小黑 下飞机了
飞机的乘客都下机,小花空姐能够开始作 清理 工做
飞机的乘客都下机,小美空姐能够开始作 清理 工做
飞机的乘客都下机,小惠空姐能够开始作 清理 工做

经过结果能够发现,空姐都是等全部的乘客下飞机以后,才作清理工做的.结果正确,无毛病.

打赏

若是以为个人文章写的还过得去的话,有钱就捧个钱场,没钱给我捧我的场(帮我点赞或推荐一下)
微信打赏
支付宝打赏

相关文章
相关标签/搜索