CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。

简单例子

  1. import java.util.concurrent.CountDownLatch;
  2.  
  3. /**
  4. * 出发点:等待所有线程执行完成
  5. * @author yinchuan.chen
  6. *
  7. */
  8. public class CountDownLatchTest {
  9.  
  10. public static void main(String[] args) throws InterruptedException {
  11. CountDownLatch cdl = new CountDownLatch(4);
  12. for(int i = 0; i < 4; i++) {
  13. final int count = i;
  14. Thread t = new Thread(new Runnable() {
  15.  
  16. public void run() {
  17. System.out.println(count);
  18. cdl.countDown();
  19. }
  20. });
  21.  
  22. t.start();
  23. }
  24.  
  25. cdl.await();
  26. System.out.println("等所有现场执行完成,才打印");
  27.  
  28. }
  29. }

注:countDown最好是在finally里面调用

  1. import java.util.concurrent.CountDownLatch;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;

  4. public class CountDownLatchDemo {
  5. private static final int PLAYER_AMOUNT = 5;
  6. public CountDownLatchDemo() {
  7. }
  8. /**
  9. * @param args
  10. */
  11. public static void main(String[] args) {
  12. //对于整个比赛,所有运动员结束后才算结束
  13. CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
  14. Player[] plays = new Player[PLAYER_AMOUNT];
  15.  
  16. for(int i=0;i<PLAYER_AMOUNT;i++)
  17. plays[i] = new Player(i+1,end);
  18.  
  19. //设置特定的线程池,大小为5
  20. ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
  21. for(Player p:plays)
  22. exe.execute(p); //分配线程
  23. System.out.println("Race begins!");
  24. try{
  25. end.await(); //等待end状态变为0,即为比赛结束
  26. }catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }finally{
  29. System.out.println("Race ends!");
  30. }
  31. exe.shutdown();
  32. }
  33. }
  34.  
  35. class Player implements Runnable {
  36.  
  37. private int id;
  38. private CountDownLatch end;
  39. public Player(int i, CountDownLatch end) {
  40. super();
  41. this.id = i;
  42. this.end = end;
  43. }
  44.  
  45. @Override
  46. public void run() {
  47. try{
  48. Thread.sleep((long)(Math.random()*100)); //随机分配时间,即运动员完成时间
  49. System.out.println("Play"+id+" arrived.");
  50. }catch (InterruptedException e) {
  51. e.printStackTrace();
  52. }finally{
  53. end.countDown(); //使end状态减1,最终减至0
  54. }
  55. }
  56. }
  1. 参考 http://www.cnblogs.com/yezhenhan/archive/2012/01/07/2315652.html

CountDownLatch使用例子的更多相关文章

  1. CountDownLatch如何使用

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  2. 什么时候使用CountDownLatch

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  3. CountDownLatch使用详解

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  4. CountDownLatch使用场景

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  5. 并发编程(二)—— CountDownLatch、CyclicBarrier和Semaphore

    本文将讲解CountDownLatch,CyclicBarrier和Semaphore这三个并发包里面的辅助类. CountDownLatch 正如每个Java文档所描述的那样,CountDownLa ...

  6. CountDownLatch的简单讲解

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  7. 深入浅出Java并发中的CountDownLatch

      1. CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中 ...

  8. 腾讯面试居然跟我扯了半小时的CountDownLatch

    一个长头发.穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:看你简历上有写熟悉并发编程,CountDo ...

  9. java并发编程JUC第九篇:CountDownLatch线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

随机推荐

  1. [转]EntityFramework走马观花之CRUD(上)

    学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...

  2. Java基础之访问文件与目录——移动或复制文件和目录(MoveAndCopyFiles)

    控制台程序,创建和删除目录以及复制和移动文件. import java.nio.file.*; import java.nio.file.attribute.*; import java.io.IOE ...

  3. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  4. C#删除xml中某个节点的子节点方法

    if (File.Exists(xmlFilePath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFilePath); Xm ...

  5. Java线程总结

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: class 类名 extends Thread ...

  6. tostring() 作用

    tostring() 作用 -->显示类中属性的值 -->不想显示该类的内存地址

  7. hdu5381 The sum of gcd

    莫队算法,预处理出每个数字往后的gcd情况,每个数字的gcd只可能是他的因子,因此后面最多只可能有logn种,可以先预处理出,然后套莫队算法,复杂度O(n*sqrt(n)*log(n)). 代码 #i ...

  8. cocos2d-x游戏开发之动画

    MyGame.h中声明动画函数: class MyGame : public cocos2d::Layer{public: static Scene* createScene();    void U ...

  9. struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)

    第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...

  10. 0422 数学口袋精灵app

    首先要部署这个app项目就是第一步: 一.前提下载并安装JDK 在线图解:手把手教你安装JDK      http://www.lvtao.net/server/windows-setup-jdk.h ...