一、含义

  CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

二、原理

  CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

三、CountDownLatch类的方法

CountDownLatch类只提供了一个构造器:

  public CountDownLatch(int count) {  };  //参数count为计数值
 
构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值
 
 
然后下面这3个方法是CountDownLatch类中最重要的方法:
 public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行

 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行

 public void countDown() { };  //将count值减1
 
注意:
  一个countDownLatch的作用只能使用一次,当counDownLatch对象的计数器被初始化之后不能再次初始化或者修改。当调用countDown()方法使count为0时,await()方法阻塞的线程都会被唤醒执行,之后再使用countDown()等方法已经没有用了,CountDownLatch对象也就没有用了。
 
下面看一个例子大家就清楚CountDownLatch的用法了:
 public class Test {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2); new Thread(){
public void run() {
try {
System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
Thread.sleep(3000);
System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start(); new Thread(){
public void run() {
try {
System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
Thread.sleep(3000);
System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start(); try {
System.out.println("等待2个子线程执行完毕...");
latch.await();
System.out.println("2个子线程已经执行完毕");
System.out.println("继续执行主线程");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

执行结果:

 线程Thread-0正在执行
线程Thread-1正在执行
等待2个子线程执行完毕...
线程Thread-0执行完毕
线程Thread-1执行完毕
2个子线程已经执行完毕
继续执行主线程

最新文章

  1. awk应用
  2. CORS基础要点:关于dataType、contentType、withCredentials
  3. 汽车遥控钥匙HCS101/HCS200/HCS201/HCS300芯片解密
  4. html slelect 标签默认值
  5. Net use命令
  6. 基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译
  7. Linux shell下批量创建缩略图
  8. Java中处理Linux信号量
  9. confluence5.8.10的使用
  10. WCF websocket
  11. HTML——window.document对象练习题
  12. WPF开发进阶 - Fody/PropertyChanged(二)
  13. 解决移动端click点击问题
  14. Python_字符串的大小写变换
  15. 在windows系统下安装linux虚拟机(VMware)
  16. 英语口语练习系列-C40-电器-访友
  17. MAC 调用GCC 提示xcrun: error: invalid active developer path
  18. 混合编译.c/.cpp与.cu文件
  19. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】HAWQ数据仓库 使用之 gpfdist协议
  20. 使用RetionalRose根据现有的java工程逆向生成类图

热门文章

  1. 使用 Apache Tiles 3 构建页面布局
  2. css做鼠标指向图片图片放大但边框不放大
  3. docker registry的https错误解决
  4. globalToLocal和localToGlobal
  5. 【BZOJ2565】最长双回文串 Manacher
  6. SpringMVC笔记——Spring+MyBatis组合开发简单实例
  7. Centos7.0配置MySQL主从服务器
  8. IOS学习笔记48--一些常见的IOS知识点+面试题
  9. 该死的Kafka,远程连接Kafka超时以及解决办法
  10. Java SAX handle xml