JUC-闭锁:CountDownLatch
CountDownLatch::闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行。
实例化:参数:设置一个计数器的值。
final CountDownLatch latch = new CountDownLatch(5);
计数器减一:
latch.countDown();
计数器等待:
latch.await();
效果:首先初始化一个CountDownLatch对象,该对象设置计数器的值,在需要运算的地方,每次执行完一次运输,通过latch.countDown()方法来执行减一,
等到latch的初始化值减为0的时候,latch后面的代码才能执行。
例如:有5个线程,每个线程都有一些运算,需要计算5个线程全部执行完了后,花了多长时间。
假如不使用countDownLatch,直接在线程前后加上时间记录。
package com.atguigu.juc; import java.util.concurrent.CountDownLatch; /*
* CountDownLatch :闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行
*/
public class TestCountDownLatch { public static void main(String[] args) { LatchDemo ld = new LatchDemo(); long start = System.currentTimeMillis(); for (int i = 0; i < 5; i++) {
new Thread(ld).start();
} long end = System.currentTimeMillis();
System.out.println("耗费时间为:" + (end - start));
}
} class LatchDemo implements Runnable { @Override
public void run() { synchronized (this) {
for (int i = 0; i < 50000; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
}
} }
这样计算的结果是有问题的,因为主线程本身是一个线程,即使循环里面的线程没有执行完依然会执行后面的:此时得到的结果是不准确的
long end = System.currentTimeMillis();
System.out.println("耗费时间为:" + (end - start));
要想所有线程都执行完了才计算结果,使用countDownLatch,通过计数器,闭锁。
使用CountDownLatch后的代码:
package com.atguigu.juc;
import java.util.concurrent.CountDownLatch; /*
* CountDownLatch :闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行
*/
public class TestCountDownLatch { public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(5);
LatchDemo ld = new LatchDemo(latch); long start = System.currentTimeMillis(); for (int i = 0; i < 5; i++) {
new Thread(ld).start();
} try {
//只有当计数器的指为0的时候,这里才能执行下面的话
latch.await();
} catch (InterruptedException e) {
} long end = System.currentTimeMillis();
System.out.println("耗费时间为:" + (end - start));
}
} class LatchDemo implements Runnable { private CountDownLatch latch; public LatchDemo(CountDownLatch latch) {
this.latch = latch;
} @Override
public void run() { synchronized (latch) {
try {
for (int i = 0; i < 50000; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
} finally {
//每次执行完,该计数器减一
latch.countDown();
}
}
} }
JUC-闭锁:CountDownLatch的更多相关文章
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- Java并发编程原理与实战二十六:闭锁 CountDownLatch
关于闭锁 CountDownLatch 之前在网上看到过一篇举例非常形象的例子,但不记得是出自哪里了,所以这里就当自己再重新写一篇吧: 例子如下: 我们每天起早贪黑的上班,父母每天也要上班,有一天定了 ...
- 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)
此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...
- 闭锁CountDownLatch与栅栏CyclicBarrier
https://blog.csdn.net/lmc_wy/article/details/7866863 闭锁CountDownLatch与栅栏CyclicBarrier 浅谈 java ...
- 4.闭锁 CountDownLatch
/*CountDownLatch 闭锁*/ CountDownLatch 是一各同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 闭锁可以延迟线程的进度 直到 其到达终 ...
- 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)[转]
此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...
- JUC 一 CountDownLatch(闭锁)
java.util.concurrent 介绍 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 CountDownLatch cou ...
- Java并发编程之闭锁CountDownLatch简单介绍
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个 ...
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...
- 闭锁——CountDownLatch
一.概念 闭锁是一个同步工具类,主要用于等待其他线程活动结束后,再执行后续的操作.例如:在王者荣耀游戏中,需要10名玩家都准备就绪后,游戏才能开始. CountDownLatch是concurrent ...
随机推荐
- Monotouch/WCF: How to consume the wcf service without svcutil
Becuase monotouch compile to native code, so it has some limitation such as dynamic invoke is not al ...
- delphi win64 DEBUG不能进预设断点的问题
delphi win64 DEBUG不能进预设断点的问题 delphi win64,debug模式下运行,如果含有中文路径,不能进断点,音频跟踪.而同样的代码,DELPHI WIN32却没有这个问题 ...
- 在VirtualBox中为已有的磁盘增加磁盘大小
①打开CMD,进入到具体虚拟机镜像的存放位置. ②输入命令:VBoxManage modifyhd uuid --resize 25000,这里的25000单位是M,表示修改后的硬盘大小.若是VBox ...
- Windows Server 2003 R2 IIS服务的命令行方式重启命令
iisreset /RESTART 停止后启动 iisreset /START 启动IIS (如果停止) iisreset /STOP 停止IIS (如果启动) iisreset /REB ...
- 使用HTML5画饼图
在进行数据的统计分析时, 饼图也是比较经常用到的一类统计图. 需求分析: 一个饼图一般包含以下几部分: 1.标题 2.扇形 3.份额(百分比) 4.标识器 设计: ...
- select点击option获取文本输入框的焦点事件
HTML文件: <select id="secOrderNum" style="margin-bottom:10px;width:90px;" data- ...
- 项目bug的修正
这几个月来,大部分业余时间,都花在阅读软件工程和编译原理方面的书籍上了.软件工程方面的书,包括软件需求.风险管理.敏捷建模,系统设计,软件项目管理,还有一些类似于的沉思录书籍等. 在这些书中,都只是讲 ...
- C# 编程指南
此部分详细介绍了 C# 语言主要功能,以及通过 .NET Framework 可以在 C# 中使用的功能. 阅读此部分的大部分内容的前提是,你已对 C# 和一般编程概念有一定的了解. 如果完全没有接触 ...
- ubuntu 安装 mongodb 数据库
第一步:下载安装包 下载版本:3.0.1 下载链接:http://www.mongodb.org/downloads 首先在linux中解压缩安装程序 通过命令操作: 解压:[root@localho ...
- OpenCV 脸部跟踪(2)
前面一篇文章中提到,我们在一副脸部图像上选取76个特征点,以及这些特征点的连通性信息来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型. 通常,脸部形状特征点能 ...