1 什么是CountDownLatch呢?

  先看看官网的定义 :一种同步帮助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

  现在由我来解释什么是CountDownLatch吧;比如说我当前存在4个线程,其中一个是主线程,3个普通线程。我们要做一个项目,希望线程A负责自动登陆,线程B负责记录登陆日志,线程C负责加载页面信息;而我的主线程则只需要在三者完成后才启动,执行其他的应用;

CountDownLatch(int count) 构造一个用给定计数初始化的 CountDownLatch。

  这是CountDownLatch的构造器,count为当前线程的数量,比如上述我们可以传入一个4;

public void await()throws InterruptedException
public boolean await(long timeout,TimeUnit unit) throws InterruptedException
public void countDown()

await()方法有两个,其中一个指定了超时时间。调用此方法的线程会被挂起,而调用countDown()方法的线程,每一次的调用都会使得之前构造器中的count的值减去1;知道为0时,调用过await()方法的线程会被唤醒,开始执行。

  请看如下的代码:

package com.net;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CountDownLatchDemo { // 1 创建CountDownLatch对象
private CountDownLatch cdl = new CountDownLatch(2);
// 1.1 生成随机数对象
private Random rnd = new Random(); // 2 第一个线程对象
class FirstTask implements Runnable {
private String id; public FirstTask(String id) {
this.id = id;
} @Override
public void run() {
System.out.println("Thread " + id + " is start");
try {
// 休眠几秒
Thread.sleep(rnd.nextInt(1000));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Thread " + id + " is over");
// 线程执行完毕调用一次countDown()方法
cdl.countDown(); }
} // 3 第二个线程对象
class SecondTask implements Runnable {
private String id; public SecondTask(String id) {
this.id = id;
} @Override
public void run() {
try {
// 调用await()方法,使得当前线程挂起
cdl.await();
} catch (InterruptedException e) { e.printStackTrace();
}
//当当前线程被唤醒之后才开始执行
System.out.println("----------Thread " + id + " is start");
try {
Thread.sleep(rnd.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("----------Thread " + id + " is over");
} }
public static void main(String[] args) {
// 创建一个线程池
ExecutorService es = Executors.newCachedThreadPool();
CountDownLatchDemo cdld = new CountDownLatchDemo();
//将c,d交给任务2,说明会被率先挂起
es.submit(cdld.new SecondTask("c"));
es.submit(cdld.new SecondTask("d"));
//将a,b交给任务1开始执行
es.submit(cdld.new FirstTask("a"));
es.submit(cdld.new FirstTask("b"));
es.shutdown();
}
}

最新文章

  1. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
  2. BZOJ 1003 物流运输 题解 【SPFA+DP】
  3. [HIHO1196]高斯消元·二(高斯消元、枚举自由变元)
  4. 基于Open vSwitch搭建虚拟路由器
  5. devexpress中如何给TabPage控件的Tab定义背景色
  6. Build 2016概览
  7. windows_phone指定时间后执行函数
  8. ls 显示目录和文件的技巧
  9. Classes and Objects :类和对象(1)
  10. uva 12097 - Pie
  11. 【HDOJ】2363 Cycling
  12. Linux shell 之 提取文件名和目录名的一些方法
  13. 【SSH三大框架】Hibernate基础第一篇:编写第一个Hibernate程序
  14. 规范 : 过程 : login cookies sessionTimeOut
  15. nth-child 和nth-type的区别
  16. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用
  17. SSH2——filter过滤器
  18. AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能
  19. data science学习笔记1
  20. Java面试题_简答题

热门文章

  1. Django模型系统——ORM表结构对应关系
  2. LeetCode:位运算实现加法
  3. 每天一个Linux命令(17)whereis命令
  4. JQuery- JQuery学习
  5. 在线编辑代码[django]版本
  6. eclipse快捷提示原理
  7. 八 Django框架,模板语言
  8. HTML5中Modernizr类库的作用和使用
  9. hadoop_学习_00_资源帖
  10. html5 tab横向滚动,无滚动条(transform:translate)