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. ssh允许root用户登陆

    新的系统无root用户密码,设置root用户密码,修改也是这么修改 sudo passwd root 连续输入两次新密码. 允许root用户登陆: /etc/ssh/sshd_config 找到 Pe ...

  2. mysql innobackupex备份实施

    最近用innobackup进行备份测试,我们只备份一个innodb类型的库,数据大小大概50多G,用innobackupex大概用了5个多小时,但是mysqldump只用了大约2个小时,这让我很费解, ...

  3. 动态顺序表(C++实现)

    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ...

  4. Charles进行HTTPS抓包(iOS为例)

    各种抓包工具的原理都是一样的,使用方面也都是差不多的,因为最近在用Mac,所以抓包工具开始用Charles了,记录一下抓取HTTPS的步骤. 连接代理, 开启抓包工具, 手机设置代理服务器,端口号(默 ...

  5. JVM中垃圾回收算法

    GC 算法与种类 GC的概念 Garbage Collection 垃圾收集1960年 List 使用了GCJava中,GC的对象是堆空间和永久区 引用计数法 老牌垃圾回收算法通过引用计算来回收垃圾使 ...

  6. centos5.5源更新方法(网易163源 很快的源)

    http://blog.chinaunix.net/uid-24993824-id-189965.html 1.首先,打开终端,获取root权限 2.关闭fastestmirror插件         ...

  7. linux学习-环境变量与文件查找

  8. matlab产生很多个相同的数字

    如产生100行1列的0.5: ones(100,1)*0.5:

  9. python爬取某个网站的图片并保存到本地

    python爬取某个网站的图片并保存到本地 #coding:utf- import urllib import re import sys reload(sys) sys.setdefaultenco ...

  10. linux应用之make命令详解

    从源代码安装过软件的朋友一定对 ./configure && make && make install 安装三步曲非常熟悉了.然而究竟这个过程中的每一步幕后都发生了些什 ...