JAVA多线程之CountDownLatch
前序:
上周测试给开发的同事所开发的模块提出了一个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的更多相关文章
- Java多线程之CountDownLatch学习
给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...
- JAVA多线程之CountDownLatch与join的区别
首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...
- Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html 一:CountDownLatch CountDownLatch是一个执行 完成任务 ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- Java多线程之Runnable与Thread
Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...
- JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止
JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 背景 当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境 ...
随机推荐
- Oracle11g不能导出空表问题
ORACLE 11g 用exp命令导出库文件备份时,发现只能导出来一部分表而且不提示错误,之前找不到解决方案只能把没导出来的表重新建建立.后来发现是所有的空表都没有导出来.于是想好好查查,因为在以前的 ...
- C语言中一些不被熟知的特性
designated initializers(c99) C99允许你对结构体中指定的变量初始化,如 struct Foo { int x; int y; int z; }; }; 指定初始化也可适用 ...
- css:background-position > 精灵技术
background-position : length || length background-position : position || position 取值: length : 百分数 ...
- Akka Serialization
Akka本身使用了Protocol Buffers来序列化内部消息(比如gossip message).Akka系统还可以配置自定义序列化机制. 配置conf akka { actor { ## 在a ...
- bzoj 4872: [Shoi2017]分手是祝愿
Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...
- JMeter测试HTTPS
HTTP和HTTPS测试时稍有不同,HTTPS需要加载证书,端口也不一样,操作如下: 1)下载被测网站证书导入 见图为流程: 2)使用JMeter自带的证书 ApacheJMeterTemporar ...
- Java基础之引用(String,char[],Integer)总结
1.String的引用: 下列代码执行后的结果为: public class Test { public static void main(String[] args) { StringBuffer ...
- 七行代码开始flask
前言: 对于现有的企业接口服务实现方式来说,Java比较适用于大型的并发式的业务场景:而对一些低IO的且功能简单的数据接口来说,Python似乎更合适.近几年流行的Flask可以说是专为接口式开发而生 ...
- 小白的Python之路 day5 random模块和string模块详解
random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...
- Linux下设置SSH端口
SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会话 ...