文档章节

(十)java多线程之CountDownLatch

天之妖星
 天之妖星
发布于 2017/05/08 14:24
字数 974
阅读 4
收藏 0

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

引言

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

理论

CountDownLatch在初始化的时候需要一个count参数.调用await()的线程会一直等待,直到其他线程调用countDown使count清空为0.通常所有等待中的线程会被释放并且后面继续调用await的线程会立即返回.这个是一次性操作,count不能被重置的.如果想要被重置的话,就可以参考(九)java多线程之CyclicBarrier

  • CountDownLatch(int count) 构造一个指定countCountDownLatch
  • await() 如果当前的count为0的话,则会立即返回,否则当前线程一直等待,直到以下情况至少发生一个

    • 其他线程调用countDown使count清空为0
    • 当前线程被其他线程中断
  • await(long timeout, TimeUnit unit) 如果当前的count为0的话,则会立即返回,否则当前线程一直等待,直到以下情况至少发生一个

    • 其他线程调用countDown使count清空为0
    • 当前线程被其他线程中断
    • 指定的时间超时
  • 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();
        }
    }
}

运行一下结果:

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

通过结果可以发现,空姐都是等所有的乘客下飞机之后,才做清理工作的.结果正确,无毛病.


打赏

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

© 著作权归作者所有

共有 人打赏支持
天之妖星
粉丝 1
博文 30
码字总数 58258
作品 0
深圳
高级程序员
私信 提问
java多线程系列:通过对战游戏学习CyclicBarrier

CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一...

huangzd
2018/01/06
0
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
0
0
java中高级大公司多线程面试题

1)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编...

java成功之路
2018/10/30
0
0
Java中高级面试必问之多线程TOP50(含答案)

以下为大家整理了今年一线大厂面试被问频率较高的多线程面试题,由于本人的见识局限性,所以可能不是很全面,也欢迎大家在后面留言补充,谢谢。 1、什么是线程? 2、什么是线程安全和线程不安...

老道士
2018/08/28
0
0
【转】15个顶级Java多线程面试题及回答

Java 线程面试问题   在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务...

一只死笨死笨的猪
2014/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq

灰暗
27分钟前
0
0
Flink

flink HA部署 flink搭建,采用分布式部署方式,分别为A,B,C三个节点。其中A为master;A,B,C为worker。 本文使用的用户是hadoop用户(自己新建) 先决条件 Java 1.8.x or higher scala 自己使用...

-九天-
54分钟前
2
0
数据中台和传统数仓的区别

中台系统把业务层同性的算法能力,服务能力,业务能力高度集成,有效组织 ,动态规划。更好的帮助上层业务。 今天就让我们看看关于数据中台的问答吧。 1 Q : 什么是数据中台? A : 数据中台是...

hblt-j
56分钟前
4
0
Java在什么时候会出现内存泄漏

在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对...

群星纪元
59分钟前
2
0
android 打开摄像头

private SurfaceHolder mHolder; private SurfaceView mSurfaceView; private Camera mCamera; mSurfaceView = (SurfaceView) this.findViewById(R.id.camsurfaceView1); mHolder = mSurface......

jingshishengxu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部