Java并发编程之闭锁CountDownLatch简单介绍
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时。这扇门才会打开并容许全部线程通过。它能够使一个或多个线程等待一组事件发生。
闭锁状态包含一个计数器。初始化为一个正式,正数表示须要等待的事件数量。
countDown方法递减计数器。表示一个事件已经发生,而await方法等待计数器到达0。表示等待的事件已经发生。
CountDownLatch强调的是一个线程(或多个)须要等待另外的n个线程干完某件事情之后才干继续运行。
场景应用:
10个运动员准备赛跑,他们等待裁判一声令下就開始同一时候跑,当最后一个人通过终点的时候,比赛结束。
10个运动相当于10个线程,这里关键是控制10个线程同一时候跑起来,还有怎么推断最后一个线程到达终点。能够用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。
package concurrent.thread;
import java.util.concurrent.CountDownLatch;
class Racer implements Runnable{
private CountDownLatch start;
private CountDownLatch finish;
private int number;
public Racer(int number, CountDownLatch start, CountDownLatch finish){
this.start = start;
this.finish = finish;
this.number = number;
}
@Override
public void run() {
try {
System.out.println(number + "th racer ready!");
//等待起跑的命令
//注意这里不是用wait()
start.await();
System.out.println(number + "th racer finish!");
//跑完
finish.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException{
final int num = 10;
CountDownLatch start = new CountDownLatch(1);//这里最好用CyclicBarrier
CountDownLatch finish = new CountDownLatch(num);
for(int i = 1; i <= num; i++){
new Thread(new Racer(i, start, finish)).start();;
}
//等待一秒。防止线程没准备好就開始运行
//假设用CyclicBarrier。这里就不用等待了
Thread.sleep(1000);
System.out.println("比赛開始");
//比赛開始
start.countDown();
//等待比赛结束
finish.await();
System.out.println("比赛结束");
}
}
输出:
1th racer ready!
5th racer ready!
4th racer ready!
3th racer ready!
2th racer ready!
9th racer ready!
8th racer ready!
6th racer ready!
10th racer ready!
7th racer ready!
比赛開始
1th racer finish!
3th racer finish!
6th racer finish!
8th racer finish!
2th racer finish!
9th racer finish!
4th racer finish!
5th racer finish!
7th racer finish!
10th racer finish!
比赛结束
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时。这扇门才会打开并容许全部线程通过。它能够使一个或多个线程等待一组事件发生。
闭锁状态包含一个计数器。初始化为一个正式,正数表示须要等待的事件数量。
countDown方法递减计数器。表示一个事件已经发生,而await方法等待计数器到达0。表示等待的事件已经发生。
CountDownLatch强调的是一个线程(或多个)须要等待另外的n个线程干完某件事情之后才干继续运行。
10个运动相当于10个线程,这里关键是控制10个线程同一时候跑起来,还有怎么推断最后一个线程到达终点。能够用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。
package concurrent.thread;import java.util.concurrent.CountDownLatch;class Racer implements Runnable{private CountDownLatch start;private CountDownLatch finish;private int number;public Racer(int number, CountDownLatch start, CountDownLatch finish){this.start = start;this.finish = finish;this.number = number;}@Overridepublic void run() {try {System.out.println(number + "th racer ready!");//等待起跑的命令//注意这里不是用wait()start.await();System.out.println(number + "th racer finish!");//跑完finish.countDown();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException{final int num = 10;CountDownLatch start = new CountDownLatch(1);//这里最好用CyclicBarrierCountDownLatch finish = new CountDownLatch(num);for(int i = 1; i <= num; i++){new Thread(new Racer(i, start, finish)).start();;}//等待一秒。防止线程没准备好就開始运行//假设用CyclicBarrier。这里就不用等待了Thread.sleep(1000);System.out.println("比赛開始");//比赛開始start.countDown();//等待比赛结束finish.await();System.out.println("比赛结束");}}
Java并发编程之闭锁CountDownLatch简单介绍的更多相关文章
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...
- Java并发编程之闭锁与栅栏
一.前言 闭锁与栅栏是在多线程编程中的概念,因为在多线程中,我们不能控制线程的执行状态,所以给线程加锁,让其按照我们的想法有秩序的执行. 闭锁 CountDownLatch,实例化时需要传入一个int ...
- Java并发编程(三)概念介绍
在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对 ...
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...
- Java并发编程笔记之 CountDownLatch闭锁的源码分析
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...
- Java并发编程之闭锁简介
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过.它可以使一个或多个线程等待一组事件发生.闭锁状态包括一个计数器 ...
- java并发编程之二--CountDownLatch的使用
CountDownLatch类 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...
随机推荐
- JavaSE学习总结第12天_API常用对象2
12.01 Scanner的概述和构造方法原理 Scanner类概述:JDK5以后用于获取用户的键盘输入 构造方法:public Scanner(InputStream source) publi ...
- Java基础之编程语法(二)
1.常量: 整型:整数,4个字节. 长整型:整数,8个字节.以L结尾. 单精度浮点数:小数,4个字节.以F结尾. 双精度浮点数:小数,8个字节. 布尔:只有两个值,真(true)或假(false),1 ...
- {% load staticfiles %}
原先写法 {# <link rel="stylesheet" href="/static/css/reset.css"/>#} 不使用路径写法,方便 ...
- jQuery通知插件noty
jQuery 通知查件noty 简单使用 官方:http://ned.im/noty/ 其它查件推荐 NotifIt Demo http://js.itivy.com/jiaoben1852/inde ...
- APNs原理解析
什么是APNs 先说一下远程推送,一般我们有自己的服务器,在这个过程中是Provider的角色,如图,推送从我们的服务器到我们的APP的过程就是要通过APNs来发送 APNs(Apple Push N ...
- VC程序快速删除自己(可能做升级程序的时候有用)
项目一般都会带有卸载程序,如果这个程序是自己来做的话,在调用完卸载程序后需要删除自己的所有文件,在Google了好久终于找到一些相关信息,一般只能删除一个文件,经过自己的处理,可以删除文件夹下面所有内 ...
- 腾讯QQ是用什么语言开发的(转)
腾讯QQ的部分COM组件用的VC6,用exescope看其中几个dll的依赖,依赖于MFC42.dll,MSVCRT.dll,MSVCP60.dll都说明是VC6写的. 还有一部分用的VS2005,包 ...
- STL set的用法
要使用set需要事先引入一个头文件 #include<set> set是一个不允许重复的集合,如果要重复可以使用multiset. 1.set的插入[set.insert();],会返回P ...
- Runtime.getRuntime().exec中命令含有括号问题
在写批量运行bat工具的时候.想起了之前写的定时小工具里面的运行方法. 使用Runtime.getRuntime().exec方法. Runtime.getRuntime().exec("c ...
- 一个例子:HelloWorld
作为C语言来说,我是用的是QT Creator作为开发工具. 事实上使用什么工具无所谓.重要的是学到实用的知识. 第一个实例程序就是HelloWorld程序.上代码: 版权声明:您好,转载请离开我的博 ...