前序:

上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现。

经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消除bug。

什么时候用?

多线程是在很多地方都会用到的,但是我们如果想要实现在某个特定的线程运行完之后,再启动另外一个线程呢,这个时候CountDownLatch就可以派上用场了

怎么用?

先看看普通的多线程代码:

 1 package code;
 2
 3 public class MyThread extends Thread {
 4     public static void main(String[] args) {
 5         MyThread th = new MyThread();
 6         Thread t1 = new Thread(th, "Mythread");
 7         t1.start();
 8         System.out.println(Thread.currentThread().getName());
 9         }
10         public void run()
11             {
12                 Mythread1 th2 = new Mythread1();
13                 Thread t2 = new Thread(th2, "Mythread1");
14                 t2.start();
15                 System.out.println(this.currentThread().getName());
16             }
17         class Mythread1 extends Thread
18         {
19             public void run() {
20                 try {
21                     Thread.sleep(1000);
22                 } catch (InterruptedException e) {
23                     // TODO Auto-generated catch block
24                     e.printStackTrace();
25                 }
26                 System.out.println(this.currentThread().getName());
27                 }
28
29         }
30     }

代码如上,先用MyThread继承了Thread类,然后在MyThread类内部又写了一个MyThread1类,同样也是继承了Thread类,并且在run方法里面让它睡1秒,这样运行代码,就会打印出:

从上面的输出顺序可以看出,先是启动了main线程,然后再启动了MyThread线程,在MyThread线程中,又启动了MyThread1线程。但是由于让MyThread1线程睡了1秒,模拟处理后续业务,这样他就比MyThread运行完毕的时间晚一些。

现在,在代码中加上CountDownLatch ,要让MyThread1先运行完毕,再让MyThread继续运行。

 1 package code;
 2
 3 import java.util.concurrent.CountDownLatch;
 4
 5 public class MyThread extends Thread {
 6     CountDownLatch countDownLatch = new CountDownLatch(1);
 7     public static void main(String[] args) {
 8         MyThread th = new MyThread();
 9         Thread t1 = new Thread(th, "Mythread");
10         t1.start();
11         System.out.println(Thread.currentThread().getName());
12         }
13         public void run()
14             {
15                 Mythread1 th2 = new Mythread1();
16                 Thread t2 = new Thread(th2, "Mythread1");
17                 t2.start();
18                 try {
19                     countDownLatch.await();
20                 } catch (InterruptedException e) {
21                     e.printStackTrace();
22                 }
23                 System.out.println(this.currentThread().getName());
24             }
25         class Mythread1 extends Thread
26         {
27             public void run() {
28                 try {
29                     Thread.sleep(1000);
30                 } catch (InterruptedException e) {
31                     e.printStackTrace();
32                 }
33                 System.out.println(this.currentThread().getName());
34                 countDownLatch.countDown();
35                 }
36
37         }
38     }

代码写法如上所示,大致分三步

1,我们先new一个CountDownLatch对象入参设置为1(我个人理解的这个就像是new一个数组一样,什么时候数组清空了,那就可以让被中断的线程继续运行了)

2,在MyThread类中调用countDownLatch.await();让当前线程停止运行。

3,在Mythread1类中调用countDownLatch.countDown()方法。当Mythread1全部执行完毕,再最后调用该方法,作用就是把我说的“数组”清空。

看看输出的打印结果

结果如上图,是符合预期的结果的。

最后再说下CountDownLatch countDownLatch = new CountDownLatch(1)的入参,这块设置的是1,那就需要调用一次countDownLatch.countDown()减去1。

如果是其他数字,那就要调用相应的次数,否则调用countDownLatch.await()的线程都不会被继续执行。

转载于:https://www.cnblogs.com/JJJ1990/p/8328319.html

JAVA多线程之CountDownLatch相关推荐

  1. Java多线程之CountDownLatch用法

    Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...

  2. (十)java多线程之CountDownLatch

    目录 引言 理论 例子 打赏 本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://gi ...

  3. java多线程之CountDownLatch倒数闸门

    在多个线程进行协作时,一个常见的情景是一个线程需要等待另外的线程完成某些任务之后才能继续进行.在这种情况下,可以使用CountDownLatch类,CountDownLatch类相当于多个线程等待开启 ...

  4. 高级JAVA - 多线程之CountDownLatch

    package com.xbz.thread.juc.countDownLatch;import java.util.concurrent.CountDownLatch;/*** @title Cou ...

  5. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  6. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  7. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  8. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

  9. Java多线程之CAS深入解析

    Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...

最新文章

  1. 自动发现网络拓扑,一站式点击完成
  2. idea目录后面有中括号
  3. linux下文件权限管理
  4. 【Linux开发】linux设备驱动归纳总结(六):3.中断的上半部和下半部——tasklet...
  5. 孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项
  6. 查询类网站或成站长淘宝客新金矿
  7. 记一次lvs-tunnel模式的故障分析(7)
  8. 重磅!MobileNetV3 来了!
  9. 谷歌也挖墙脚啊[抠鼻]
  10. mysql 授权 失败_完美解决mysql客户端授权后连接失败的问题
  11. Redis 锁的实现方案
  12. MovieLens推荐系统数据集官方文档+解释
  13. 计算机网页文档无法复制怎么办,电脑网页不能右键复制怎么办|电脑无法复制网页内容的解决方法...
  14. 接口测试方法论——WebSocket一点通
  15. 【电商】电商后台设计—库存模块
  16. Rosalind第二题:将DNA转录为RNA
  17. NVM Node版本管理工具
  18. 拟推荐全省文物系统先进_关于对拟表彰全省文博系统文化遗产工作先进集体和先进工作者公示的公告...
  19. 算法:食物链(并查集)
  20. how2j学习总结-未完

热门文章

  1. java直接对list使用sql语句_Java和SQL语句阶段考试错题集
  2. mysql server uuids_master and slave have equal MySQL server UUIDs 解决方法
  3. JSP EL表达式 将数组拼接成字符串
  4. 【Thymeleaf】格式化日期
  5. linux如何给各节点时间同步,Linux 系统配置各个节点的时间一致性
  6. 多功能雨伞项目计划书_雨伞项目投资计划书
  7. 2d游戏引擎_游戏60秒:RTS游戏从2D到3D的蜕变
  8. 怎么在pycharm打开浏览器_Mac OS下搭建 python3+pycharm+selenium+Chrome环境
  9. 命令行请求jsp页面_JSP 之 8种HTTP的请求方式 之 页面组成等
  10. k-modes算法mysql_第十一章 K-Means(K均值)算法模型实现(中)