一.简介:

  Latch意思是:门闩的意思,形象的来说await就是拴上门闩,等到门闩释放后当前线程开始工作。

下面是来自简书上的解释:

  CountDownlatch是一个多功能的同步工具,可以被用于各种目的。一个CountDownLatch通过一个值为1的count被初始化,来作为一个开/关的门或门闩:所有调用了await()的线程都会在门前等待,直到门被一个线程通过调用countDown()打开。一个被初始化为N的CountDownLatch可以被用来“在N个线程都完成了某种操作(或者一些操作已经被完成了N次)之后创建一个线程”。

CountDownLatch一个有用的属性就是它不需要线程们在继续执行之前,调用countDown来等待count被减到0。它简单地阻止了任何调用了await()的线程继续,直到所有的线程都能够通过。

二.实例:

  两个线程各自执行100次,对i加1,等待两个线程结束输出i值。
  

  1. import java.util.concurrent.CountDownLatch;
  2.  
  3. /**
  4. * Created by cuijunyong on 2018/2/3.
  5. */
  6. public class Xunhuan {
  7. public static int i = 0;
  8. private static final CountDownLatch end = new CountDownLatch(2);
  9. private static final CountDownLatch start = new CountDownLatch(1);
  10. public static void main(String[] args) throws Exception{
  11.  
  12. A a = new A();
  13. // A b = new A();
  14. MyThread myThread = new MyThread();
  15. Thread b = new Thread(myThread);
  16. // Thread[] threads = new Thread[10];
  17. // for(int x = 0; x < threads.length; x++){
  18. // threads[i] = new Thread(myThread);
  19. // threads[i].start();
  20. // }
  21. a.start();
  22. b.start();
  23. System.out.println("开始工作了\n");
  24. start.countDown();
  25. end.await();
  26. System.out.println("a:" + a.isAlive());
  27. System.out.println("b:" +b.isAlive());
  28. System.out.println("i=" + i);
  29. }
  30.  
  31. static class MyThread implements Runnable{
  32.  
  33. public void run() {
  34. // int i = 0;
  35. try {
  36. start.await();
  37. int j = 0;
  38. while (j < 100){
  39. j++;
  40. i++;
  41.  
  42. System.out.println("B = " + i);
  43.  
  44. }
  45. System.out.println("end.count = " + end.getCount());
  46. end.countDown();
  47.  
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53.  
  54. static class A extends Thread{
  55. @Override
  56. public void run() {
  57. // int i = 0;
  58. try {
  59. start.await();
  60. int j = 0;
  61. while (j < 100){
  62. j++;
  63. i++;
  64. System.out.println("A = " + i);
  65. }
  66. System.out.println("end.count = " + end.getCount());
  67. end.countDown();
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73.  
  74. }

结果:前面略略略

  1. A = 190
  2. A = 191
  3. A = 192
  4. A = 193
  5. A = 194
  6. A = 195
  7. B = 171
  8. end.count = 2
  9. B = 196
  10. B = 197
  11. B = 198
  12. B = 199
  13. B = 200
  14. end.count = 1
  15. a:false
  16. b:false
  17. i=200

并发编程(CountDownLatch使用)的更多相关文章

  1. Java并发编程-CountDownLatch

    基于AQS的前世今生,来学习并发工具类CountDownLatch.本文将从CountDownLatch的应用场景.源码原理解析来学习这个并发工具类. 1. 应用场景 CountDownLatch是并 ...

  2. 高并发编程-CountDownLatch深入解析

    要点解说 CountDownLatch允许一个或者多个线程一直等待,直到一组其它操作执行完成.在使用CountDownLatch时,需要指定一个整数值,此值是线程将要等待的操作数.当某个线程为了要执行 ...

  3. java并发编程CountDownLatch

    /** * CountDownLatch用法 * CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.比如有一个任务A, * 它要等待其他4 ...

  4. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  5. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  6. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  7. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

  8. 并发编程(三):从AQS到CountDownLatch与ReentrantLock

    一.目录      1.AQS简要分析      2.谈CountDownLatch      3.谈ReentrantLock      4.谈消费者与生产者模式(notfiyAll/wait.si ...

  9. 并发编程(七)——AbstractQueuedSynchronizer 之 CountDownLatch、CyclicBarrier、Semaphore 源码分析

    这篇,我们的关注点是 AQS 最后的部分,共享模式的使用.本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier.Semaphore 的 ...

  10. Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)

    我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...

随机推荐

  1. BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP

    题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...

  2. 2. Spring 的 HelloWorld

    初学Spring,就先来写一个 Spring 的 HelloWorld 吧 1. 首先,新建一个 java Project(因为暂时不需要网页,所以就不用创建 web 项目了) 2. 导入 Sprin ...

  3. PAT-Top1002. Business (35)

    在一个项目的截止日期之前,如果工期有空闲则可能可以开展其他项目,提高效益.本题考查动态规划.数组dp[i][t]表示在截止时间为t时,前i个项目工作安排能够产生的最大收益,而前i个项目的截止时间都不大 ...

  4. 线段树模板hdu 1166:敌兵布阵

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. JAVA自学笔记03

    1.三目运算符 1)格式:(关系表达式)?表达式1:表达式2 true则执行表达式1,false则执行表达式2 @ 例题1 :求两数中的较大值 System.out.println(x>y?x: ...

  6. 透明Panel

    unit TransparentPanel; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Varia ...

  7. Mysql查询特定值是哪些表哪些字段

    摘自网上 -- 查询整个数据库中某个特定值所在的表和字段的方法 # flush tables; -- 创建表来存储查询结果 drop table if exists tmp_table; CREATE ...

  8. 终止java线程的2种方法

    1.使用一个volatile的共享变量 2.使用interrupt方法 import java.util.concurrent.TimeUnit; /** * ThreadTest */ public ...

  9. BAT 删除隐藏文件

    删除文件 del命令参数说明/F   强制删除文件./S      从所有子目录删除指定文件./Q      安静模式.删除全局通配符时,不要求确认./A      根据属性选择要删除的文件. 删除指 ...

  10. Docker在windows下的使用【二】

    可参考学习地址: 极客学院docker教程,还不错,可以参考 1.Dockerhub下载镜像 下载地址:Dockerhub地址 有两种方式可以获得新的镜像 直接从dockerhub下载编译好的imag ...