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能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...
随机推荐
- mysql innodb存储引擎的聚集索引
InnoDB聚集索引 MySQL有没有支持聚集索引,取决于采用哪种存储引擎. MySQL InnoDB一定会建立聚集索引,所谓聚集,指实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚集索 ...
- .net 中实现php rawurlencode方法(RFC3986)
在对接api时候,经常需要对字符串进行各种编码处理,系统可能是异构的,实现语言也就可能是不一样的.所以经常会使人犯一些2B的错误! 比如:php实现的api中用了rawurlencode,文档中写,需 ...
- mongoDB用java实现增删改查
package mongo; import java.net.UnknownHostException; import com.mongodb.BasicDBObject; import com.mo ...
- 由Qt4.x项目移植到Qt5.x需要注意的事项
The Transition from Qt 4.x to Qt 5 The transition from Qt 4.x to Qt 5 is not expected to be signific ...
- spring 框架整合 笔记4
struts hibernate spring 先贴出框架整合需要的maven <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...
- 基于visual Studio2013解决C语言竞赛题之0301函数求值
题目 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <math.h> void main() ...
- android编程——百度地图初探
项目需要,花了一天时间研究了下百度地图的API,其实看起来可能会有点困难,但是将它的DEMO跑起来之后一切都迎刃而解的样子了.百度方面讲地图的接口封装的挺不错的,而且现在能够提供的地图的服务也有将近十 ...
- 解析LayoutSubviews
layoutSubviews作用 layoutSubviews是对subviews重新布局.比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,既可以实现对子视图重新布局 ...
- linux命令--sysctl
sysctl sysctl被用来在执行时配置内核参数.这些参数都存储在/proc/sys/(以键-值对形式存储)中.你可以用sysctl来读和写数据 命令参数 variable 要读的键值的名字 ...
- Java class文件分析工具 -- Classpy
Classpy Classpy是一个图形化的class文件分析工具,功能和javap类似,界面主要參考了Java Class Viewer: 为什么要又一次创造轮子? 写这个工具花了将近一周的时间.那 ...