CountDownLatch的使用

火影  金牌会员 | 2023-2-22 15:38:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 786|帖子 786|积分 2358

1.概述

CountDownLatch就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。
注意:java中还有一个同步工具类叫做CyclicBarrier,他的作用和CountDownLatch类似。同样是等待其他线程都完成了,才可以进行下一步操作,我们再举一个例子,在打王者的时候,在开局前所有人都必须要加载到100%才可以进入。否则所有玩家都相互等待。
我们看一下区别:
CountDownLatch: 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。 CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。关键点其实就在于那N个线程(1)CountDownLatch里面N个线程就是学生,学生做完了试卷就可以走了,不用等待其他的学生是否完成(2)CyclicBarrier 里面N个线程就是所有的游戏玩家,一个游戏玩家加载到100%还不可以,必须要等到其他的游戏玩家都加载到100%才可以开局
 2.简单使用
  1. //指定人数
  2.         CountDownLatch countDownLatch = new CountDownLatch(2);
  3.         new Thread(){
  4.             @Override
  5.             public void run() {
  6.                 super.run();
  7.                 System.out.println("第一个人交卷");
  8.                 //countDownLatch的count减一
  9.                 countDownLatch.countDown();
  10.             }
  11.         }.start();
  12.         try {
  13.             //等待时间  如果countDownLatch的count=0 返回true 否则返回false 这里处于阻塞状态
  14.             boolean await = countDownLatch.await(10, TimeUnit.SECONDS);
  15.             System.out.println(await);
  16.         } catch (InterruptedException e) {
  17.             e.printStackTrace();
  18.         }
  19.         System.out.println("考试结束");
复制代码
运行结果


 
 3.原理

CountDownLatch主要使用countDown方法进行减1操作,使用await方法进行等待操作
countDown


 
 OK。到了这一步我们可能会纳闷,sync是个什么鬼,releaseShared方法又是如何实现的。我们不妨接着看源码

 
 在这里我们发现继承了AbstractQueuedSynchronizer(AQS)。AQS的其中一个作用就是维护线程状态和获取释放锁。在这里也就是说CountDownLatch使用AQS机制维护锁状态。而releaseShared(1)方法就是释放了一个共享锁。
await原理

不带参数的await会一直等待,直到CountDownLatch的count为0,带参数的await最多等待指定时间退出,如果时间没到,CountDownLatch的count为0就立刻退出。如果CountDownLatch的count为0返回true,否则返回false。

 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表