CountDownLatch

 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能

CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作
  之前,它允许一个或多个线程一直等待

闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活
  动直到其他活动都完成才继续执行:
     确保某个计算在其需要的所有资源都被初始化之后才继续执行;
     确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
     等待直到某个操作所有参与者都准备就绪再继续执行

闭锁:

在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行

案例:测试线程执行的时间

public class TestCountDownLatch {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch();
LatchDemo ld = new LatchDemo(latch); //计算执行时间
long start = System.currentTimeMillis();
for(int i=;i<;i++){
new Thread(ld).start();
} long end = System.currentTimeMillis();
System.out.println("线程执行的时间为:" + (start -end));
}
} class LatchDemo implements Runnable{ private CountDownLatch countDownLatch; public LatchDemo(CountDownLatch latch){
this.countDownLatch = latch;
} @Override
public void run() { for(int i= ;i<;i++){
if(i%==){
System.out.println(i);
}
}
}
}

此时无法得到10个子线程的执行时间

因为在子线程执行完成之前main函数的线程已经执行完毕

此时我们需要设置main函数线程在10个子线程执行完毕之后再执行

进行修改设置:

public class TestCountDownLatch {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch();
LatchDemo ld = new LatchDemo(latch); //计算执行时间
long start = System.currentTimeMillis();
for(int i=;i<;i++){
new Thread(ld).start();
} try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("线程执行的时间为:" + (start -end));
} } class LatchDemo implements Runnable{ private CountDownLatch countDownLatch; public LatchDemo(CountDownLatch latch){
this.countDownLatch = latch;
} @Override
public void run() { synchronized(this){
try {
for(int i= 0;i<5000;i++){
if(i%2==0){
System.out.println(i);
}
}
} finally {
//递减1
countDownLatch.countDown();
}
}

}
}

main函数中有10个线程

所以需要设置10个闭锁

每个线程执行之后都需要将其的值进行减一

所以在线程中:

synchronized:此时可能出现同部数据的设置

使用CountDownLatch的countDown()方法将其值进行递减1

同时需要使用await()放法进行等待所有线程执行完成之后再执行之后的代码

所以会在最后进行打印10个线程消耗的时间:

4、JUC--CountDownLatch闭锁的更多相关文章

  1. juc并发工具类之CountDownLatch闭锁

    import java.util.concurrent.CountDownLatch; /** * 闭锁: 在进行某些运算时, 只有其他所有线程的运算全部完成,当前运算才继续执行(程序流中加了一道栅栏 ...

  2. CountDownLatch闭锁

    CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完 ...

  3. CopyOnWriteArrayList(写入并复制) & CountDownLatch(闭锁)

    ConcurrentHashMap: ①Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能.② ConcurrentHashMap 同步容器 ...

  4. 6. CountDownLatch 闭锁

    package com.gf.demo05; import java.util.concurrent.CountDownLatch; /** * CountDownLatch : 闭锁,在完成某些操作 ...

  5. 同步机制之--java之CountDownLatch闭锁

    CountDownLatch闭锁 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.CountDown ...

  6. 【同步工具类】CountDownLatch闭锁任务同步

    [同步工具类]CountDownLatch闭锁任务同步 转载:https://www.cnblogs.com/yangchongxing/p/9214284.html 打过dota的同学都知道,多人一 ...

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

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

  8. CountDownLatch(闭锁)

    一.闭锁(Latch)    闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都 ...

  9. CountDownLatch——闭锁的实现之一

    CountDownLatch实际上是一种闭锁实现.闭锁:是一种同步工具类,可以延迟线程的进度知道其到达终止状态--<Java并发编程实战>.这个怎么解释呢?简单来说,就是有1个线程需要等待 ...

  10. CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏

    同步工具类可以是任何一个对象.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore).栅栏(Barrier).以及闭锁(Latch). 所有的同步工具类都包含一些特定的结构 ...

随机推荐

  1. 基于hive的日志分析系统

    转自 http://www.cppblog.com/koson/archive/2010/07/19/120773.html           hive 简介         hive 是一个基于  ...

  2. BestCoder Round #29——A--GTY's math problem(快速幂(对数法))、B--GTY's birthday gift(矩阵快速幂)

    GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. linux7 安装GitLab

    1.安装Linux虚拟机-- 安装后配置a.停止防火墙# systemctl stop firewalld.service# systemctl disable firewalld.service# ...

  4. JavaScript高级编程———基本包装类型String和单体内置对象Math

    JavaScript高级编程———基本包装类型和单体内置对象 <script> var stringObject = new String("hello world") ...

  5. gulp常用插件汇总

    1.gulp-sass 预编译 sass 文件为 css 文件,SASS 不多说,如果项目中有使用 sass ,那么这个插件应该是必备的.前面的一篇文章中,已经对该插件有所使用了,可配置编译后输出风格 ...

  6. springboot项目中js、css静态文件路径访问

    springboot静态文件访问的问题,相信大家也有遇到这个问题,如下图项目结构. 项目结构如上所示,静态页面引入js.css如下所示. 大家肯定都是这样写的,但是运行的话就是出不来效果,图片也不显示 ...

  7. Echarts地图绘制(散点,色卡)

    echarts绘制地图时,提供了js内部注册,也提供了json数据手动注册,这两种都可以绘制对应地图,但有一点不同的是,js内部只注册了中国地图和世界地图,而json数据提供了世界,中国,中国城市的数 ...

  8. 在ASP.NET MVC 中使用ActiveReports报表控件

    随着MVC模式的广泛运用,对Web应用系统的开发带来了巨大的影响,我们好像又回到了原来的ASP时代,视乎这是一种后退而不是一种进步,不过MVC模式给我们带来的影响不仅限于我们所看到的这一点..MVC看 ...

  9. memset初始化数组的问题

    今天才搞清楚,memset用于初始化数组,仅能初始化为0值,而不能初始化一个特定的值,这怎么能模糊了呢??? 因此,如果对申请的一段存放数组的内存进行初始化,每个数组元素均初始化为特定的值,必须使用循 ...

  10. VS2008 试图运行未注册64位调试器组件

    安装即可