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. 1043 Is It a Binary Search Tree (25 分)(二叉查找树)

    #include<bits/stdc++.h> using namespace std; typedef struct node; typedef node *tree; struct n ...

  2. BZOJ 2186 沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 3397  Solved: 1164 [Submit] ...

  3. gulp (转)

    “1. 我为什么使用grunt: 2. 我为何放弃grunt转投gulp: 3. 我为何放弃gulp与grunt,转投npm scripts: 4. 我为何放弃前端” —— 司徒正美 前端(段子)界的 ...

  4. IPv6的一些特殊地址

    IPv6的一些特殊地址   2008年7月3日第二次修正! 昨天是修正了地址部分,本想发上来的,没来得及.今天修正了NDP协议,接下来会是路由和转换部分. 总结一下各协议的精华:OSPF在于LSA,B ...

  5. 等差子序列(sequence)

    等差子序列(sequence) 题目描述 给一个1到N的排列{Ai},询问是否存在1<= p1 < p2 < p3 < p4 < p5 < - < pLen ...

  6. APIO2017游记

    铁牌选手爆零滚粗记QAQ........ CCF说不让讨论APIO相关内容不过现在应该没事了吧QAQ day0:上午还在学校填清北夏令营的表,下午上火车去北京,晚上颓颓颓...... day1:上午网 ...

  7. php中json_encode和json_decode的用法

    1.json_encode基本用法:数组转字符串 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); ...

  8. Linux机器-网卡磁盘监控

    1)实时监控网卡流量的通用脚本: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...

  9. jsp的九大内置对象及EL表达式的隐含对象

    九大内置对象: request         request对象具有请求域,即完成客户端的请求之前,该对象一直有效. response       response对象具有页面作用域,即访问一个页面 ...

  10. 百度经验:Win10查看已存储WiFi密码的两种方法

    方法一:网络和共享中心查询 具体步骤可以参考:Win10查看WIFI密码的方法 方法二:命令提示符查询 1.右键单击开始按钮,选择“命令提示符(管理员)” 2.输入如下命令(下图①号命令): nets ...