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();
}
}

CountDownLatch分析的更多相关文章

  1. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  2. java源码-Semaphore源码分析

    Semaphore内部Sync对象同样也是继承AQS,跟Reentrant一样有公平锁跟非公平锁区分,但是Semaphore是基于共享锁开发,Reentrant是基于独占锁开发.主要就是初始化Sema ...

  3. java 并发(五)---AbstractQueuedSynchronizer(3)

           文章代码分析和部分图片来自参考文章 问题 : CountDownLatch  和 CyclicBarrier 的区别 认识 CountDownLatch 分析这个类,首先了解一下它所可以 ...

  4. 【JUC】JDK1.8源码分析之CountDownLatch(五)

    一.前言 分析完了CyclicBarrier后,下面分析CountDownLatch,CountDownLatch用于同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成.CountDownL ...

  5. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  6. 并发编程(七)——AbstractQueuedSynchronizer 之 CountDownLatch、CyclicBarrier、Semaphore 源码分析

    这篇,我们的关注点是 AQS 最后的部分,共享模式的使用.本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier.Semaphore 的 ...

  7. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...

  8. Java - "JUC" CountDownLatch源码分析

    Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例 CountDownLatch简介 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前 ...

  9. CountDownLatch使用场景及分析

    JDk1.5提供了一个非常有用的包,Concurrent包,这个包主要用来操作一些并发操作,提供一些并发类,可以方便在项目当中傻瓜式应用. JDK1.5以前,使用并发操作,都是通过Thread,Run ...

随机推荐

  1. eclipse的问题:如何在debug模式下,能始终看到某变量的值

    Window—>Show View—>other—>Debug—>Expressions中左边是变量名,右边显示变量value.

  2. iOS 尝试用 block 闭包 去代替delegate 实现方法

    通常都是这样创建alert 再加一个代理 // 创建一个UIAlertView并显示出来 UIAlertView *alertview = [[UIAlertView alloc] initWithT ...

  3. zabbix实现mysql数据库的监控(一)

    zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.它能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问 ...

  4. CSS3自定义下拉框菜单

    在线演示 本地下载

  5. jQuery图片水平滑动延迟加载动画

    在线演示 本地下载

  6. 第二十一篇 socket

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求 socket和file的 ...

  7. Unigui unidbgrid+unidac uniquery联合使用时产生的奇葩问题

    如下一个uniquery查询: SELECT a.id,a.userid,a.name,if(a.completed='T',CONCAT('<a  class="icons" ...

  8. dhtmlxgrid v3.0学习笔记

    dhtmlxgrid v3.0学习笔记 分类: dhtmlx JavaScript2012-01-31 15:41 1744人阅读 评论(0) 收藏 举报 stylesheetdatecalendar ...

  9. Oracle角色管理

    --创建角色 create role role_name [not identified |--无需验证的方式 identified by [password]--密码验证的方式 | identifi ...

  10. CSS3 3D立体柜子实现

    1. [图片] 20140811233657.jpg 2. [图片] 120140811233846.jpg ​3. [代码][CSS]代码 body {      background-color: ...