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能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...
随机推荐
- django 基础入门(二)
一.关于数据库 1.首先django 1.9以上等版本不支持pymysql,因此需要做一些调整. 比如在settings.py 加入一段代码: import pymysql pymysql.insta ...
- NOI 能量采集
/** 大意: 求解 在[1,n] x, [1,m] y,之间有多少个gcd(x,y) = d d = min(n,m) 思路: 对于任意一个d 在[1,n] x, [1,m] y, gcd(x,y) ...
- poj 3252
http://poj.org/problem?id=3252//自己搞了很长时间...现在刚刚有点明白.. 1 #include <iostream> using namespace st ...
- 瀑布流的三种实现方式(原生js+jquery+css3)
前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写.最近闲来没事,就自己写个.大致思路理清楚,还是挺好实现的... 原生javascript版 ...
- skin++ 终极破解之法
*[标题]:Skin++通用界面换肤系统V2.0.1破解探讨 *[作者]:gz1X <gz1x(at)tom(dot)com> *[来自]:中国黑客联盟 *[前言]: skin技术,大家都 ...
- Python 連接 MySQL
Python 連接 MySQL MySQL 是十分流行的開源資料庫系統,很多網站也是使用 MySQL 作為後台資料儲存,而 Python 要連接 MySQL 可以使用 MySQL 模組.MySQLdb ...
- 为了肾六(dp)
为了肾六 时间限制:4000 ms | 内存限制:210535 KB 难度:2 描述 最近肾六很流行,goshawk看身边的朋友都用上了apple.自己还用着W年前的Samsung.于是决定去 ...
- XMPP个人信息展示
在现阶段的通信服务中.各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现.实现了整个及时通信服务协议的互 ...
- javaku快捷键
Eclipse 的编辑功能非常强大,掌握了 Eclipse 快捷键功能,能够大大提高开发效率.Eclipse 中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户编辑的好帮手,能为用 ...
- Xcode使用source control 时提示the server certificate failed to verify 的解决办法
wusipingdeMacBook-Pro:~ railgun$ wusipingdeMacBook-Pro:~ railgun$ svn ls https://13.13.13.134:8443/s ...