前序:

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

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

什么时候用?

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

怎么用?

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

 package code;

 public class MyThread extends Thread {
public static void main(String[] args) {
MyThread th = new MyThread();
Thread t1 = new Thread(th, "Mythread");
t1.start();
System.out.println(Thread.currentThread().getName());
}
public void run()
{
Mythread1 th2 = new Mythread1();
Thread t2 = new Thread(th2, "Mythread1");
t2.start();
System.out.println(this.currentThread().getName());
}
class Mythread1 extends Thread
{
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.currentThread().getName());
} }
}

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

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

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

 package code;

 import java.util.concurrent.CountDownLatch;

 public class MyThread extends Thread {
CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) {
MyThread th = new MyThread();
Thread t1 = new Thread(th, "Mythread");
t1.start();
System.out.println(Thread.currentThread().getName());
}
public void run()
{
Mythread1 th2 = new Mythread1();
Thread t2 = new Thread(th2, "Mythread1");
t2.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.currentThread().getName());
}
class Mythread1 extends Thread
{
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.currentThread().getName());
countDownLatch.countDown();
} }
}

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

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()的线程都不会被继续执行。

JAVA多线程之CountDownLatch的更多相关文章

  1. Java多线程之CountDownLatch学习

    给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...

  2. JAVA多线程之CountDownLatch与join的区别

    首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...

  3. Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html  一:CountDownLatch CountDownLatch是一个执行 完成任务 ...

  4. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  5. JAVA多线程之wait/notify

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

  6. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  7. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  8. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  9. JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止

    JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 背景 当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境 ...

随机推荐

  1. Oracle11g不能导出空表问题

    ORACLE 11g 用exp命令导出库文件备份时,发现只能导出来一部分表而且不提示错误,之前找不到解决方案只能把没导出来的表重新建建立.后来发现是所有的空表都没有导出来.于是想好好查查,因为在以前的 ...

  2. C语言中一些不被熟知的特性

    designated initializers(c99) C99允许你对结构体中指定的变量初始化,如 struct Foo { int x; int y; int z; }; }; 指定初始化也可适用 ...

  3. css:background-position > 精灵技术

    background-position : length || length background-position : position || position 取值: length  : 百分数 ...

  4. Akka Serialization

    Akka本身使用了Protocol Buffers来序列化内部消息(比如gossip message).Akka系统还可以配置自定义序列化机制. 配置conf akka { actor { ## 在a ...

  5. bzoj 4872: [Shoi2017]分手是祝愿

    Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...

  6. JMeter测试HTTPS

    HTTP和HTTPS测试时稍有不同,HTTPS需要加载证书,端口也不一样,操作如下:  1)下载被测网站证书导入 见图为流程: 2)使用JMeter自带的证书 ApacheJMeterTemporar ...

  7. Java基础之引用(String,char[],Integer)总结

    1.String的引用: 下列代码执行后的结果为: public class Test { public static void main(String[] args) { StringBuffer  ...

  8. 七行代码开始flask

    前言: 对于现有的企业接口服务实现方式来说,Java比较适用于大型的并发式的业务场景:而对一些低IO的且功能简单的数据接口来说,Python似乎更合适.近几年流行的Flask可以说是专为接口式开发而生 ...

  9. 小白的Python之路 day5 random模块和string模块详解

    random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...

  10. Linux下设置SSH端口

    SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会话 ...