【Coucurrency-CountDownLatch】-20161203-0002
简介
java异步任务相关的工具。主要用在某些线程需要等到其他线程完成某些操作后才能执行的场景。
等待线程需要显示的调用wait方法,表示线程当前挂起,需要等到countdownLatch到0才执行。另一些线程调用countDown对countDownLatch - 1,达到0时则调用wait方法的线程得到执行。
小故事
小明去吃铁板烧快餐,来到窗口后他发现都是旧菜但是他希望吃刚煮好的。经过交谈后师傅承诺之前的菜卖完就给他煮新的,这个时候小明就占据了这个窗口,其他窗口则继续卖菜。终于旧菜卖完了小明也拿到了新的菜,愉快的吃起了饭。
这里窗口就是线程数,小明所在窗口需要其他窗口把旧菜卖完才能有新的菜,小明所在的线程是挂起的,其他窗口每卖一份就对这个菜减一。菜的量就是CountDownLatch。
DEMO
package calvin;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
public class TestCountDownLatch {
public static void main(String[] args){
CountDownLatch latch = new CountDownLatch(2);
Window win = null;
for(int i =0; i< 4; i ++){
win = new Window(latch);
new Thread(win).start();
}
System.out.println("wait");
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("down");
}
public static class Window implements Runnable{
private CountDownLatch latch = null;
public Window(CountDownLatch latch){
this.latch = latch;
}
@Override
public void run(){
int time = new Random().nextInt(5) * 1000;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread = " + Thread.currentThread().getName());
latch.countDown();
}
}
}
// 运行结果:
wait
thread = Thread-1
thread = Thread-0
down
thread = Thread-3
thread = Thread-2
小结
CountDonwLatch可以用作一个计数器。主要用在某个线程需要等待某个事件发生后才能被执行的地方。
【Coucurrency-CountDownLatch】-20161203-0002的更多相关文章
- 【GOF23设计模式】单例模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_单例模式.应用场景.饿汉式.懒汉式 1.GOF23设计模式 2.单例模式 3.饿汉式 1 package com.t ...
- 【性能诊断】十一、性能问题综合分析(案例2,windbg、wireshark)
[问题描述]: 前段时间有一项目反馈,常用的审批功能有时的响应较慢,多个管理员功能不定期的出现客户端无响应的状况,并且管理员功能一旦出现卡死,也会影响到普通的业务用户致使很多用户无法操作. ...
- 【JVM虚拟机】(7)---深入理解Class中-属性集合
#[JVM虚拟机](7)---深入理解Class中-属性集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)- ...
- 【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引
JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 ...
- 【并发编程】【JDK源码】J.U.C--AQS 及其同步组件(2/2)
原文:慕课网高并发实战(七)- J.U.C之AQS 在[并发编程][JDK源码]AQS (AbstractQueuedSynchronizer)(1/2)中简要介绍了AQS的概念和基本原理,下面继续对 ...
- 【精解】EOS TPS 多维实测
本文主要研究EOS的tps表现,会从插件.cleos.EOSBenchTool以及eosjs四种方式进行分析研究. 关键字:eos, tps, cleos, txn_test_gen_plugin, ...
- 【RL系列】马尔可夫决策过程——状态价值评价与动作价值评价
请先阅读上两篇文章: [RL系列]马尔可夫决策过程中状态价值函数的一般形式 [RL系列]马尔可夫决策过程与动态编程 状态价值函数,顾名思义,就是用于状态价值评价(SVE)的.典型的问题有“格子世界(G ...
- 【面试题】2018年最全Java面试通关秘籍汇总集!
[面试题]2018年最全Java面试通关秘籍汇总集!(转载于互联网) 前几天在交流群里有些小伙伴问面试相关的试题,当时给出了一些问题,苦于打字太累就没写下去了,但觉得这是一个很不负责任的表现,于是 ...
- 【并发编程】Future模式添加Callback及Promise 模式
Future Future是Java5增加的类,它用来描述一个异步计算的结果.你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果.你也可以使用 ...
- SQL语句复习【专题三】
SQL语句复习[专题三] DML 数据操作语言[insert into update delete]创建表 简单的方式[使用查询的结果集来创建一张表]create table temp as sele ...
随机推荐
- wcf在post请求时,关于string类型参数传入中文的处理
一.方法默认只有一个参数 (1)BodyStyle = WebMessageBodyStyle.Bare [OperationContract][WebInvoke(Method = "PO ...
- C# List<string> to string
List<string> names = new List<string>() { "John", "Anna", "Moni ...
- RS485转USB插电脑上通讯不上
在确定没有其他问题时,基本可以确定是干扰问题,换个24V电源试试,不要用原来的线 485接口确定,好坏通过两个相反对接,发送信息,两边一致,就可以
- Qt 适合做界面
确实感觉的Qt的界面开发相比MFC方便了许多,不用为设计和实现窗口烦恼.不需要太细研究界面的实现,从Qt自带的例子中就能轻松学习和应用.在界面开发上Qt的实用比MFC前进了许多.做C++开发不管怎样如 ...
- C#总结小程序
主要功能 左侧树状图功能 添加,修改,删除 1.添加 点击添加按钮执行点击事件 弹出机窗口之后点击添加 2.删除 点击删除执行下面的单击事件 点击确定即可删除成功. 3.修改
- day48-python爬虫学习三
Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能.他们两个最显着的差异如下: urllib2可以接受一个Request对象,并以此可以来设置一个URL的h ...
- spring MVC 入门:
概述: MVC: M model 模型,除控制和视图以外,都可以成为模型. V view 视图,JSP,HTML,ASP,PHP,XHTML,FREEMARK,JSF,直接与用户做交互的资源. C c ...
- Python-接口自动化(十)
ddt+unnittest+excel处理测试数据(九) (十一)ddt 1.利用ddt实现数据驱动,ddt是第三方模块,在终端输入pip install ddt 进行安装 导入:from ddt i ...
- python简单爬虫 用lxml库解析数据
目标:爬取湖南大学2018年本科招生章程 url:http://admi.hnu.edu.cn/info/1026/2993.htm 页面部分图片: 使用工具: Python3.7 火狐浏览器 PyC ...
- SolrCloud7.4(Jetty容器)+mysql oracle 部署与应用
SolrCloud7.4(Jetty容器)搭建 1.Zookeeper搭建 版本:zookeeper-3.4.10.tar.gz 1.把zookeeper安装包上传到服务器 2.zookeeper解压 ...