java并发编程之二--CountDownLatch的使用
CountDownLatch类
允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。
构造方法:
CountDownLatch(int count)
构造一个以给定计数 CountDownLatch CountDownLatch。
方法:
- await() 导致当前线程等到锁存器计数到零,除非线程是 interrupted 。
- await(long timeout, TimeUnit unit) 使当前线程等待直到锁存器计数到零为止,除非线程为 interrupted或指定的等待时间过去。
- countDown() 减少锁存器的计数,如果计数达到零,释放所有等待的线程。
- getCount() 返回当前计数。
模拟运动员赛跑DEMO
import concurrenttest.countdownlatch.thread.Thread_1; import java.util.concurrent.CountDownLatch; /**
* 描述:模拟运动员赛跑DEMO
*
* @author bc
* @create 2018-09-28 10:49
*/
public class RunTest_1 { public static void main(String[] args) {
try {
CountDownLatch comingTag = new CountDownLatch(10);//裁判等待运动员到来
CountDownLatch waitTag = new CountDownLatch(1);//等待裁判说准备开始
CountDownLatch waitRunTag = new CountDownLatch(10);//等待起跑
CountDownLatch beginTag = new CountDownLatch(1);//起跑
CountDownLatch endTag = new CountDownLatch(10);//到达终点 Thread_1[] arr = new Thread_1[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = new Thread_1(comingTag, waitTag, waitRunTag, beginTag, endTag);
arr[i].start();
} System.out.println("裁判等待运动员到来");
comingTag.await();
System.out.println("裁判看到所有运动员都来了,巡视一下");
Thread.sleep(5000);
waitTag.countDown();
System.out.println("各就各位!");
waitRunTag.await();
Thread.sleep(2000);
System.out.println("发令枪响!");
beginTag.countDown();
endTag.await();
System.out.println("所有运动员到了,统计结果");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
RunTest_1
import java.util.concurrent.CountDownLatch; /**
* 描述: 模拟运动员赛跑
*
* @author bc
* @create 2018-09-28 10:10
*/
public class Thread_1 extends Thread { private CountDownLatch comingTag;//裁判等待运动员到来
private CountDownLatch waitTag;//等待裁判说准备开始
private CountDownLatch waitRunTag;//等待起跑
private CountDownLatch beginTag;//起跑
private CountDownLatch endTag;//到达终点 public Thread_1(CountDownLatch comingTag, CountDownLatch waitTag, CountDownLatch waitRunTag,
CountDownLatch beginTag, CountDownLatch endTag) {
super();
this.comingTag = comingTag;
this.waitTag = waitTag;
this.waitRunTag = waitRunTag;
this.beginTag = beginTag;
this.endTag = endTag;
} @Override
public void run() {
try {
System.out.println("运动员正飞奔而来");
Thread.sleep((int)(Math.random()*10000));
System.out.println(Thread.currentThread().getName()+"到起跑点了");
comingTag.countDown();
System.out.println("等待裁判说准备");
waitTag.await();
System.out.println("各就各位!准备起跑的姿势");
Thread.sleep((int)(Math.random()*10000));
waitRunTag.countDown();
beginTag.await();
System.out.println(Thread.currentThread().getName()+"疯狂奔跑中");
Thread.sleep((int)(Math.random()*10000));
endTag.countDown();
System.out.println(Thread.currentThread().getName()+"到达终点");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
Thread_1
CountDownLatch的不足
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。
详见本人github:https://github.com/BrokenColor/java-demo 下的 countdownlatch-包中的测试
java并发编程之二--CountDownLatch的使用的更多相关文章
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- Java并发编程(二)如何保证线程同时/交替执行
第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...
- Java 并发编程(二)对象的不变性和安全的公布对象
一.不变性 满足同步需求的还有一种方法是使用不可变对象(Immutable Object). 到眼下为止,我们介绍了很多与原子性和可见性相关的问题,比如得到失效数据.丢失更新操作或光查到某个对象处于不 ...
- Java并发编程(二)
1.Lock接口 在Lock接口出现之前,Java程序是靠synchronized关键字实 ...
- Java并发编程之闭锁CountDownLatch简单介绍
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个 ...
- Java并发编程笔记之 CountDownLatch闭锁的源码分析
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...
- Java并发编程(二)创建线程的三种方法
进程与线程 1. 进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线 ...
随机推荐
- Flask系列(一)flask入门
一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...
- 数据库知识,mysql索引原理
1:innodb底层实现原理:https://blog.csdn.net/u012978884/article/details/52416997 2:MySQL索引背后的数据结构及算法原理 ht ...
- 如何把PDF文件转换为JPG图片
大家有遇到需要将PDF文件转换为JPG的情况么,文档资料里面经常会有一些图片类型的内容,有的时候我们需要获取这些图片内容,但是PDF文件又是不可编辑的,那如何把PDF文件转换为JPG图片呢,跟着小编一 ...
- python实现指定目录下批量文件的单词计数:并发版本
在 文章 <python实现指定目录下批量文件的单词计数:串行版本>中, 总体思路是: A. 一次性获取指定目录下的所有符合条件的文件 -> B. 一次性获取所有文件的所有文件行 - ...
- GreenOpenPaint的实现(三)添加标尺
标尺对于图像处理程序,特别是需要精确测量的程序来说意义很大.这里进行了专门的研究. 基于现在已经引入的类和定义的变量,主要讲一讲如何调用. 1.添加放大缩小 void CGreenOpenPaintD ...
- 20145201李子璇 《网络对抗》 Web安全基础实践
1.实验后回答问题 (1)SQL注入攻击原理,如何防御 原理:通过构建特殊的输入作为参数传入web应用程序.即把SQL命令注入到Web表单的输入域或页面请求的查询字符串,和之前已经设定好的查询语句构成 ...
- 20145311 实验一 "Java开发环境的熟悉"
20145311 实验一 "Java开发环境的熟悉" 程序设计过程 实验内容 -实现四则运算,并进行测试 编写代码 1.四则运算就四种运算,我就做了个简单的,输入两个数,然后选择一 ...
- tomcat的安装和启动
下载apache-tomcat-8.5.5-src,我将其放在了/usr/local/tomcat目录下 要启动需要运行: /usr/local/tomcat/apache-tomcat-8.5.5- ...
- 如何表示各个时区的时间DateTime.ToString()
使用sqlite进行时间的插入的时候,使用了 DateTime.ToString("s") //s: 2008-06-15T21:15:07 插入到数据库之后,发现时间被加了8个 ...
- Linux查看版本当前操作系统内核信息
1. # uname -a (Linux查看版本当前操作系统内核信息) 输出 Linux xxx --generic #~-Ubuntu SMP Wed Jul :: UTC x86_64 x86_6 ...