JUC包下CountDownLatch学习笔记
CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行,
闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。
与CountDownLatch第一次交互是主线程等待其它的线程,主线程必须在启动其它线程后立即调用await方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。
其他的N个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务,这种机制就是通过countDown()方法来完成的。每调用一次这个方法,在构造函数中初始化的count值就减1,所以当N个线程都调用了这个方法count的值等于0,然后主线程就能通过await方法,恢复自己的任务。
这里的主线程是相对的概念,需要根据CountDownLatch创建的场景分析。
package com.cxy.cyclicBarrier; import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* Created by Administrator on 2017/4/10.
*/
public class CountDownDemo { private static final Random random = new Random();
// 用于判断发令之前运是否已经进入准备状态,需要等待10个准备就绪,占有锁,等待10个完成,释放锁。
private static CountDownLatch readyLatch = new CountDownLatch();
// 用于判断裁判是否已经发令,占有锁,等待裁判发令完成,释放锁
private static CountDownLatch startLatch = new CountDownLatch(); public static void main(String[] args) { // 用于判断发令之前是否已经进入准备状态,需要等待10个准备就绪,占有锁,等待10个完成,释放锁。
// CountDownLatch readyLatch = new CountDownLatch(SPORTSMAN_COUNT);
// 用于判断是否已经发令,占有锁,等待裁判发令完成,释放锁
// CountDownLatch startLatch = new CountDownLatch(1); // 启动10个线程,也就是10个,做准备工作
for (int i = ; i < ; i++) {
Thread t = new Thread(new MyTask((i + ) + "号", readyLatch, startLatch));
t.start();
}
// 当前在其他准备就绪前一直等待,也就是说等readyLatch倒数计数器为0之前一直等待
try {
readyLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
} // 裁判发令,释放锁
startLatch.countDown(); System.out.println("老大:所有准备完毕,开始..."); } static class MyTask implements Runnable { private Lock lock = new ReentrantLock(); private CountDownLatch ready;
private CountDownLatch start;
private String name; public MyTask(String name, CountDownLatch ready, CountDownLatch start) {
this.ready = ready;
this.start = start;
this.name = name;
} @Override
public void run() {
lock.lock();
try { // 1. 准备就绪的逻辑,准备readyTime秒
int readyTime = random.nextInt();
System.out.println(name + ":我需要" + readyTime + "秒的时间准备。");
try {
Thread.sleep(readyTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "我已经准备完毕!");
// 释放锁readyLatch-1,表示一个已经就绪
ready.countDown();
try {
// 等待发开始命令
start.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ":行动...");
} catch (Exception e) {
// TODO: handle exception
} finally {
lock.unlock();
} } }
}
执行结果:
1号:我需要365秒的时间准备。
2号:我需要454秒的时间准备。
5号:我需要938秒的时间准备。
3号:我需要967秒的时间准备。
7号:我需要878秒的时间准备。
6号:我需要540秒的时间准备。
9号:我需要552秒的时间准备。
10号:我需要281秒的时间准备。
4号:我需要951秒的时间准备。
8号:我需要696秒的时间准备。
10号我已经准备完毕!
1号我已经准备完毕!
2号我已经准备完毕!
6号我已经准备完毕!
9号我已经准备完毕!
8号我已经准备完毕!
7号我已经准备完毕!
5号我已经准备完毕!
4号我已经准备完毕!
3号我已经准备完毕!
老大:所有准备完毕,开始...
2号:行动...
6号:行动...
1号:行动...
9号:行动...
8号:行动...
7号:行动...
10号:行动...
5号:行动...
4号:行动...
3号:行动... Process finished with exit code
countdownLatch也是也实现cycliBarrier珊拦结构,不过需要使用lock锁
JUC包下CountDownLatch学习笔记的更多相关文章
- JUC包下CyclicBarrier学习笔记
CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这 ...
- JUC包下Semaphore学习笔记
在Java的并发包中,Semaphore类表示信号量.Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理.Semaphore有两个构造函数,参数 ...
- Linux下iptables学习笔记
Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...
- YOLO---Darknet下的学习笔记 V190319
YOLO---Darknet下的学习笔记 @WP 20190319 很久没有用YOlO算法了,今天又拿过来玩玩.折腾半天,才好运行通的,随手记一下: 一是,终端下的使用.二是,python接口的使用. ...
- YOLO---Darknet下的学习笔记
YOLO.V3-Darknet下的学习笔记 @wp20180927 [目录] 一. 安装Darknet(仅CPU下) 2 1.1在CPU下安装Darknet方式 2 1.2在GPU下安装Darknet ...
- JUC.Lock(锁机制)学习笔记[附详细源码解析]
锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...
- 20135202闫佳歆--week5 系统调用(下)--学习笔记
此为个人笔记存档 week 5 系统调用(下) 一.给MenuOS增加time和time-asm命令 这里老师示范的时候是已经做好的了: rm menu -rf 强制删除 git clone http ...
- juc包:使用 juc 包下的显式 Lock 实现线程间通信
一.前置知识 线程间通信三要素: 多线程+判断+操作+通知+资源类. 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑. 在 java ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
随机推荐
- 【原】Coursera—Andrew Ng机器学习—编程作业 Programming Exercise 3—多分类逻辑回归和神经网络
作业说明 Exercise 3,Week 4,使用Octave实现图片中手写数字 0-9 的识别,采用两种方式(1)多分类逻辑回归(2)多分类神经网络.对比结果. (1)多分类逻辑回归:实现 lrCo ...
- 安装oracle xe一些注意点
主要是web管理数据的的端口8080端口的问题, 会和tomcat冲突 安装时把开启8080端口的tomcat启动了 占用8080端口就行了, 然后安装oracle xe就会让你输入 web管理数据的 ...
- java Web 过滤器Filter详解
简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...
- Python倒序循环列表(序列)
如果要倒序遍历访问序列中的元素,可以对该序列使用reversed() 函数,reversed函数会生成一份倒序列表的拷贝,但是不会改变原列表.这个函数理解起来很自然,例如 for i in rever ...
- EZOJ #201
传送门 分析 这个题和寿司晚宴有点像 我们知道大于$\sqrt n$的质因子最高就是一次 于是我们对所有数以他的大质数为关键字排序 设dp[i][p2][p3][p5][p7][p11][p13][0 ...
- 利用GeoServer发布web地图服务
参考: http://www.cnblogs.com/beniao/archive/2011/01/11/1931028.html http://www.cnblogs.com/LBSer/p/445 ...
- ESP8266-iot-3
ESP8266 WIFI操作 参考资料 模式选择 程序: 把之前的Helloworld程序复制过来改成wifi工程 先输出获取的当前模式 编译后会出错,因为os_printf的头文件没有被包含进来 结 ...
- 字符串的查找删除---C++中string.find()函数与string::npos
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串 输入: 输入只有一组数据 输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止 输出: 删除输入的短字符串 ...
- M(必备),R(需求),C(条件),O(可选)
M:must 必备 R:request 需求 C:condition 条件 O:option 可选 AFL:application file locator 应用文件定位器 PKI:公钥索引 IPK: ...
- C# JSON使用的常用技巧(二)
JSON在php里一句json_encode就可以得到 在C#里我们同样也很容易的可以得到 用到的类库:Newtonsoft.Json.dll 实体类: class Cat { public stri ...