CountDownLatch使用例子
CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。
简单例子
- import java.util.concurrent.CountDownLatch;
- /**
- * 出发点:等待所有线程执行完成
- * @author yinchuan.chen
- *
- */
- public class CountDownLatchTest {
- public static void main(String[] args) throws InterruptedException {
- CountDownLatch cdl = new CountDownLatch(4);
- for(int i = 0; i < 4; i++) {
- final int count = i;
- Thread t = new Thread(new Runnable() {
- public void run() {
- System.out.println(count);
- cdl.countDown();
- }
- });
- t.start();
- }
- cdl.await();
- System.out.println("等所有现场执行完成,才打印");
- }
- }
注:countDown最好是在finally里面调用
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class CountDownLatchDemo {
- private static final int PLAYER_AMOUNT = 5;
- public CountDownLatchDemo() {
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- //对于整个比赛,所有运动员结束后才算结束
- CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
- Player[] plays = new Player[PLAYER_AMOUNT];
- for(int i=0;i<PLAYER_AMOUNT;i++)
- plays[i] = new Player(i+1,end);
- //设置特定的线程池,大小为5
- ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
- for(Player p:plays)
- exe.execute(p); //分配线程
- System.out.println("Race begins!");
- try{
- end.await(); //等待end状态变为0,即为比赛结束
- }catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- System.out.println("Race ends!");
- }
- exe.shutdown();
- }
- }
- class Player implements Runnable {
- private int id;
- private CountDownLatch end;
- public Player(int i, CountDownLatch end) {
- super();
- this.id = i;
- this.end = end;
- }
- @Override
- public void run() {
- try{
- Thread.sleep((long)(Math.random()*100)); //随机分配时间,即运动员完成时间
- System.out.println("Play"+id+" arrived.");
- }catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- end.countDown(); //使end状态减1,最终减至0
- }
- }
- }
- 参考 http://www.cnblogs.com/yezhenhan/archive/2012/01/07/2315652.html
CountDownLatch使用例子的更多相关文章
- CountDownLatch如何使用
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- 什么时候使用CountDownLatch
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- CountDownLatch使用详解
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- CountDownLatch使用场景
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- 并发编程(二)—— CountDownLatch、CyclicBarrier和Semaphore
本文将讲解CountDownLatch,CyclicBarrier和Semaphore这三个并发包里面的辅助类. CountDownLatch 正如每个Java文档所描述的那样,CountDownLa ...
- CountDownLatch的简单讲解
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- 深入浅出Java并发中的CountDownLatch
1. CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中 ...
- 腾讯面试居然跟我扯了半小时的CountDownLatch
一个长头发.穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:看你简历上有写熟悉并发编程,CountDo ...
- java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
随机推荐
- [转]EntityFramework走马观花之CRUD(上)
学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...
- Java基础之访问文件与目录——移动或复制文件和目录(MoveAndCopyFiles)
控制台程序,创建和删除目录以及复制和移动文件. import java.nio.file.*; import java.nio.file.attribute.*; import java.io.IOE ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...
- C#删除xml中某个节点的子节点方法
if (File.Exists(xmlFilePath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFilePath); Xm ...
- Java线程总结
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: class 类名 extends Thread ...
- tostring() 作用
tostring() 作用 -->显示类中属性的值 -->不想显示该类的内存地址
- hdu5381 The sum of gcd
莫队算法,预处理出每个数字往后的gcd情况,每个数字的gcd只可能是他的因子,因此后面最多只可能有logn种,可以先预处理出,然后套莫队算法,复杂度O(n*sqrt(n)*log(n)). 代码 #i ...
- cocos2d-x游戏开发之动画
MyGame.h中声明动画函数: class MyGame : public cocos2d::Layer{public: static Scene* createScene(); void U ...
- struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)
第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- 0422 数学口袋精灵app
首先要部署这个app项目就是第一步: 一.前提下载并安装JDK 在线图解:手把手教你安装JDK http://www.lvtao.net/server/windows-setup-jdk.h ...