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. 线程 线 ...
随机推荐
- SaltStack系列(一)之环境部署、命令及配置文件详解
一.SaltStack介绍 1.1 saltstack简介: saltstack是基于python开发的一套C/S架构配置管理工具,它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证 ...
- rtcp多媒体控制协议应用
rtcp package send/recv demo main.c #include <stdio.h> #include <rtp.h> #include <rtcp ...
- Linux下编译安装PHP扩展redis
[Redis] 先安装tcl: yum install tcl [下载和安装] 官网http://redis.io/ 下载最新的稳定版本,这里是3.2.0, 然后解压文件并进入. $ sudo ta ...
- Java转Exe
1.Jsmooth Java文件打包成exe文件(可以在没安装JDK的环境下运行):http://www.tuicool.com/articles/byIFJn 2.用JSmooth制作java ja ...
- NodeJS学习笔记三
map map对象是一个简单的键/值映射.任何值(包括对象和原始值)都可以用作一个键或一个值. var m = new Map(); var o = {p: "Hello World&quo ...
- 91. Decode Ways(动态规划 26个字母解码个数)
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- Educational Codeforces Round 58 Solution
A. Minimum Integer 签到. #include <bits/stdc++.h> using namespace std; #define ll long long ll l ...
- Python:执行精确的浮点数运算
需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现. 浮点数的一个普遍问题是它们并不能精确的表示十进制数.并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a ...
- 【转】微信jssdk录音功能开发记录
转自:http://www.cnblogs.com/liujunyang/p/4962423.html#undefined 0.需求描述 在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音 ...
- 20144303石宇森《网络对抗》逆向及Bof基础
20144303石宇森<网络对抗>逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...