CountDownLatch,一个同步辅助类,在完成一组其他线程汇总执行的操作前,它允许一个或多个线程一直等待
主要方法:
     public CountDownLatch(int count); 构造方法参数指定了计数的次数
     public void countDowm():     当前线程调用此方法,则计数器减1
     public void await();     调用此方法会一致阻塞当前线程,直到计数器的值为0
示例中,
package demo1;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class CountDownLatchDemo {
     final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     public static void main(String[] args) throws InterruptedException {
         CountDownLatch latch = new CountDownLatch(2);// 两个工人的协作
         Executor executor = Executors.newFixedThreadPool(2);
         executor.execute(new Worker("zhang san", 2000, latch));
         executor.execute(new Worker("li si", 3000, latch));
         /**
          * 当主线程执行到这的时候,现在一共是有3个线程在同时执行
          * 当主线程执行了latch.await()方法的时候,就会阻塞主线程,只到CountDownLatch的计数器变成0
          * 而当其他线程执行了latch.countDown()方法后,才会把计数器减一.
          * 所以这个时候,主线程就会等待计数器变成0后再执行
          */
         latch.await();
         System.out.println("all work done at " + sdf.format(new Date()));
     }
     /**
      * 匿名内部类写法
      * @author edgewalk
      * @date  2017年6月8日
      */
     static class Worker extends Thread {
         String workerName;
         int workTime;
         CountDownLatch latch;
         public Worker(String workerName, int workTime, CountDownLatch latch) {
              this.workerName = workerName;
              this.workTime = workTime;
              this.latch = latch;
         }
         public void run() {
              try {
                  System.out.println("Worker " + workerName + " do work begin at " + sdf.format(new Date()));
                  doWork();// 工作了
                  System.out.println("Worker " + workerName + " do work complete at " + sdf.format(new Date()));
              } catch (Exception e) {
                  e.printStackTrace();
              }finally {
                   if(latch != null) {
                        latch.countDown();
                     }
              }
         }
         private void doWork() {
              try {
                  Thread.sleep(workTime);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
         }
     }
}
打印结果:
     
Worker li si do work begin at 2017-06-08 23:11:38
Worker zhang san do work begin at 2017-06-08 23:11:38
Worker zhang san do work complete at 2017-06-08 23:11:40
Worker li si do work complete at 2017-06-08 23:11:41
all work done at 2017-06-08 23:11:41
补充:
     如果我们不使用CountDownLatch的await()方法,那么all work done at ...这句话就不能保证在最后打印了

线程同步工具之CountDownLatch的更多相关文章

  1. 同步工具类 CountDownLatch 和 CyclicBarrier

    在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...

  2. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

  3. 线程同步工具 Semaphore类使用案例

    参考博文 : 线程同步工具(一) 线程同步工具(二)控制并发访问多个资源 并发工具类(三)控制并发线程数的Semaphore 使用Semaphore模拟互斥锁 当一个线程想要访问某个共享资源,首先,它 ...

  4. 线程同步工具 Semaphore类的基础使用

    推荐好文: 线程同步工具(一) 线程同步工具(二)控制并发访问多个资源 并发工具类(三)控制并发线程数的Semaphore 简介 Semaphore是基于计数的信号量,可以用来控制同时访问特定资源的线 ...

  5. 并发是个什么鬼之同步工具类CountDownLatch

    扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...

  6. 同步工具:CountDownLatch、CyclicBarrier和Semaphore

    1. CountDownLatch 1.1 功能及使用场景 一个同步工具,使得一个或多个线程等待一组线程执行完成后再执行. 使用场景:等待一些前置任务执行完成后,再执行特定的功能.比如,系统启动时,各 ...

  7. JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...

  8. 同步工具类—— CountDownLatch

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...

  9. 线程同步工具CountDownLatch

    CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行.假如我们这个想要继续往下执行的任务调用一个CountDownLatc ...

随机推荐

  1. Python MySQLdb 模块使用方法

    import MySQLdb 2.和数据库建立连接 conn=MySQLdb.connect(host="localhost",user="root",pass ...

  2. 二、vue响应式对象

    Object.defineProperty Object.defineProperty 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,先来看一下它的语法: Obj ...

  3. Java获取当前服务器IP实现

    package hope.ipaddress.demo; import java.net.InetAddress; import java.net.NetworkInterface; import j ...

  4. 第1张 Maven简介 学习笔记

    什么是构建? 编译.运行单元测试.生成文档.打包和部署 Maven的应用: 构建工具 依赖管理工具 通过坐标系统定位到每一个构建(artifact) 项目信息管理工具 Maven对于项目目录结构.测试 ...

  5. POJ 2987 Firing | 最大权闭合团

    一个点带权的图,有一些指向关系,删掉一个点他指向的点也不能留下,问子图最大权值 题解: 这是最大权闭合团问题 闭合团:集合内所有点出边指向的点都在集合内 构图方法 1.S到权值为正的点,容量为权值 2 ...

  6. POJ 1149 PIGS | 最大流问题

    参考了这个PDF 第一道网络流啊!感动 #include<cstdio> #include<algorithm> #include<cstring> #includ ...

  7. 用Spring注解的方式实现对某个网页的访问

    本案例的目标是加强对@Controller   @RequestMapping  @Resource  @Service 的感性认识,能过知道这几个注解是怎么用的,以及spring和springmvc ...

  8. 网络嗅探器Wireshark

    http://www.wireshark.org/   About Wireshark Wireshark is the world's foremost network protocol analy ...

  9. webpack最佳入门实践系列(6)

    10.css模块化 10.1.什么是css模块? CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类 ...

  10. Android横竖屏总结(转)

    Android横竖屏总结(转) 横竖屏切换后Activity会重新执行onCreat函数,但是在Android工程的Mainfest.xml中加入android:screenOrientation=& ...