java并发初探CountDownLatch
java并发初探CountDownLatch
CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作。
当前前程A调用CountDownLatch的await方法进入阻塞(LockSupportd的park方法),
其他线程调用CountDownLatch调用countDown(),CountDownLatch的内部变量
count为零时,线程A唤醒。
* A synchronization aid that allows one or more threads to wait until
* a set of operations being performed in other threads completes.
*
例子
package com.java.javabase.thread.base.concurrent.lock;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CountDownLatch;
/**
* @author
*/
@Slf4j
public class CountDownLatchTest {
private static CountDownLatch countDownLatch = new CountDownLatch(5);
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
try {
log.info("thread {} call wait ",Thread.currentThread().getName());
sleep(1000);
countDownLatch.await();
log.info("thread {} end ",Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
for (int i = 0; i < 5; i++) {
new Thread() {
@Override
public void run() {
log.info("thread {} run ",Thread.currentThread().getName());
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
}
}.start();
}
log.info("current thread is {}",Thread.currentThread().getName());
try {
countDownLatch.await();
log.info("thread is {} end",Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
例子结果
2019-08-09 17:40:10,492 [Thread-1] INFO CountDownLatchTest - thread Thread-1 run
2019-08-09 17:40:10,492 [Thread-3] INFO CountDownLatchTest - thread Thread-3 run
2019-08-09 17:40:10,492 [Thread-2] INFO CountDownLatchTest - thread Thread-2 run
2019-08-09 17:40:10,492 [Thread-0] INFO CountDownLatchTest - thread Thread-0 call wait
2019-08-09 17:40:10,492 [main] INFO CountDownLatchTest - current thread is main
2019-08-09 17:40:10,492 [Thread-4] INFO CountDownLatchTest - thread Thread-4 run
2019-08-09 17:40:10,492 [Thread-5] INFO CountDownLatchTest - thread Thread-5 run
2019-08-09 17:40:11,491 [main] INFO CountDownLatchTest - thread is main end
2019-08-09 17:40:11,491 [Thread-0] INFO CountDownLatchTest - thread Thread-0 end
java并发初探CountDownLatch的更多相关文章
- java并发初探ConcurrentSkipListMap
java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...
- java并发初探ConcurrentHashMap
java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...
- java并发初探ThreadPoolExecutor拒绝策略
java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...
- java并发初探CyclicBarrier
java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...
- java并发初探ReentrantWriteReadLock
java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...
- java并发中CountDownLatch的使用
文章目录 主线程等待子线程全都结束之后再开始运行 等待所有线程都准备好再一起执行 停止CountdownLatch的await java并发中CountDownLatch的使用 在java并发中,控制 ...
- JAVA并发,CountDownLatch使用
该文章转自:http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html CountDownLatch 1.类介绍 一 ...
- Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
前言: 如果说J.U.C包下的核心是什么?那我想答案只有一个就是AQS.那么AQS是什么呢?接下来让我们一起揭开AQS的神秘面纱 AQS是什么? AQS是AbstractQueuedSynchroni ...
- Java并发编程-CountDownLatch
基于AQS的前世今生,来学习并发工具类CountDownLatch.本文将从CountDownLatch的应用场景.源码原理解析来学习这个并发工具类. 1. 应用场景 CountDownLatch是并 ...
随机推荐
- 解决安装 fireworks、photoshop 时卡在输入账号、手机号处等问题
一定要断网! 一定要断网! 一定要断网! 重要的事情说三遍! 我安装的是破解版CS6系列: 安装步骤如下: 1.当进行安装到此步时,(前面的步骤为解压文件等便不解释),选择“试用”,此时应该是 断网 ...
- 网络基础:ARP 协议、IP协议、路由协议 均属于网络层协议
ARP协议 ARP--地址解析协议(Address Resolution Protocol),实现通过 对方的IP地址(域名) 寻找对方的 MAC地址 ARP的功能 本地电脑查看 IP 和 MAC 对 ...
- Linux 目录结构与目录操作
目录结构 Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后再次目录下再创建其他目录 在Linux系统中,一切皆文件 常见目录作用 / : 所有 ...
- 【代码学习】PHP面向对象之封装与继承
一.封装(访问控制) 就是将属性私有,并提供公有的setter放置与getter取值方法注:封装是进行访问控制,不是拒绝访问 public(公有) protected(受 ...
- 【代码总结】PHP面向对象之类与对象
一.类和对象的关系 类的实体化结果是对象,而对象的抽象就是类.在开发过程中,我们通常都是先抽象(幻想)出一个类,再用该类去创建对象(实现幻想的内容).在程序中,直接使用的是我们(实现幻想)的对象,而不 ...
- servlet类常用代码
1.设置响应编码格式 response.setContentType(");
- 常见排序的Java实现
插入排序 1.原理:在有序数组中从后向前扫描找到要插入元素的位置,将元素插入进去. 2.步骤:插入元素和依次和前一个元素进行比较,若比前一个元素小就交换位置,否则结束循环. 3.代码: package ...
- mongodb的remove操作
今天学习mongodb时,打算用db.user.remove()函数把user中的数据都删了,结果没闪成功,提示:remove needs a query.上网查了一下,是因为没有给remove函数传 ...
- 实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例) 1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtup ...
- win8.1 virtualbox 安装centos7注意事项
win8.1是64位的,一开始在virtualbox中选择版本时,怎么也选不到64位的,这时要改BIOS设置,把CPU虚拟化改为允许. virtualbox是32位的,没必要非得是64位(64位的也不 ...