Latch设计模式
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args){
// ProgrammerTravleTest.test();
ProgrammerTravleTest.test2();
}
}
/*
第23章 Latch 设计模式
若干线程并发执行某个特定的任务,然后等到所有的子任务都执行结束之后再统一汇总。
23.2 CountDownLatch程序实现
23.2.1 无限等待的Latch
*/
class WaitTimeoutException extends Exception{
public WaitTimeoutException(String msg) {
super(msg);
}
}
abstract class Latch{
protected int limit;
public Latch(int limit) {
this.limit = limit;
}
//该方法会使得当前线程一致等待
public abstract void await()throws InterruptedException;
//带超时功能的
public abstract void await(TimeUnit unit, long time) throws InterruptedException,WaitTimeoutException;
//当任务线程完成工作之后调用该方法使得计数器减一
public abstract void countDown();
//获取当前还有多少个线程没有完成任务
public abstract int getUnarrived();
}
//无限等待CountDownLatch实现
class CountDownLatch extends Latch{
public CountDownLatch(int limit) {
super(limit);
}
@Override
public void await() throws InterruptedException {
synchronized (this) {
while (limit > 0) {
this.wait();
}
}
}
/*
这个写法在写改写sysn时用过了。
*/
@Override
public void await(TimeUnit unit, long time) throws InterruptedException, WaitTimeoutException {
if (time < 0) {
throw new IllegalArgumentException("The time is invalid.");
}
long remainingNanos = unit.toNanos(time);
final long endNanos = System.nanoTime()+ remainingNanos;
synchronized (this) {
while (limit > 0) {
if (TimeUnit.NANOSECONDS.toMillis(remainingNanos) <= 0) {
throw new WaitTimeoutException("The wait time over specify time.");
}
this.wait(TimeUnit.NANOSECONDS.toMillis(remainingNanos));
remainingNanos=endNanos-System.nanoTime();
}
}
}
@Override
public void countDown() {
synchronized (this) {
if (limit <= 0) {
throw new IllegalArgumentException("all of task already arrived");
}
limit--;
this.notifyAll();
}
}
@Override
public int getUnarrived() {
return limit;
}
}
//程序测试齐心协力打开门阀
class ProgrammerTravle extends Thread{
private final Latch latch;
private final String programmer;
private final String transportation;
public ProgrammerTravle(Latch latch, String programmer, String transportation) {
this.latch = latch;
this.programmer = programmer;
this.transportation = transportation;
}
@Override
public void run() {
System.out.println(programmer+" start take the transportation["+transportation+"]");
try{
TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(programmer+" arrived by "+transportation);
latch.countDown();
}
}
class ProgrammerTravleTest{
public static void test(){
Latch latch = new CountDownLatch(4);
new ProgrammerTravle(latch,"A","a").start();
new ProgrammerTravle(latch,"B","b").start();
new ProgrammerTravle(latch,"C","c").start();
new ProgrammerTravle(latch,"D","d").start();
try {
latch.await();
System.out.println("==all of programmer arrived==");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void test2(){
Latch latch = new CountDownLatch(4);
new ProgrammerTravle(latch,"A","a").start();
new ProgrammerTravle(latch,"B","b").start();
new ProgrammerTravle(latch,"C","c").start();
new ProgrammerTravle(latch,"D","d").start();
try {
latch.await(TimeUnit.SECONDS,5);
System.out.println("==all of programmer arrived==");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (WaitTimeoutException e) {
e.printStackTrace();
}
}
}
《Java高并发编程详解》笔记
Latch设计模式的更多相关文章
- Android开发中常见的设计模式
对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...
- Spring源码分析 之浅谈设计模式
一直想专门写个Spring源码的博客,工作了,可以全身性的投入到互联网行业中.虽然加班很严重,但是依然很开心.趁着凌晨有时间,总结总结. 首先spring,相信大家都很熟悉了. 1.轻量级 零配置, ...
- 转 多线程 闭锁(Latch) 栅栏(CyclicBarrier)
java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier) 标签: java并发编程 2015-05-28 16:45 2939人阅读 评论(0) 收藏 举报 本文章已收录于: . ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
随机推荐
- SQL Server根据字段查询不出记录
今天写了一条select语句,很奇怪的一件事,我写程序几年了,第一次碰到这个问题,就是数据库里有这个值,你根据这个值查询就是查询不出来这行记录. 所以我想是不是里面有空格,回车什么的,最后果然如此. ...
- LINQ查询表达式---------where子句
LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...
- asp.net网站在手机浏览器上全屏显示
前段时间要把asp.net 网站,在手机上全屏浏览,发现总是小小的一块,不能全屏 后来发现 JQuery Mobile 中在开头都用 <meta name="viewport&quo ...
- Delphi 导出数据至Excel的7种方法
一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):bool ...
- 获取其他进程中“Internet Explorer_TridentCmboBx”的内容
function GetTridentCmboBxText( // 获取其他进程中“Internet Explorer_TridentCmboBx”的内容 mHandle: THandle; // ...
- 深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good
之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...
- CrashRpt_v.1.4.2_vs2008_also_ok
1.windows多线程程序release版崩溃记录工具,便于该如何查找错误. 2.此工具主要用来配置windbug工具,一种排查程序发布版本崩溃这种非常难处理的缺陷的方法,非常棒,amazing! ...
- <iOS 导航栏>第一节:导航栏透明方法实现代码
说下导航栏的透明方法: 很多应用需要导航栏随着向上滑动,逐渐从透明变成不透明,很炫酷,大部分应用都在使用导航栏渐变效果,现附上代码然后直接将实现,一会讲下如何来实现,这一部分直接上代码. ...
- Servlet 3.0异步特性初探
Servlet 是 Java 为了编写服务端程序而定义的一个接口规范,在 Servlet 3.0 以后支持了异步的操作. 最近项目添加了一个代码热部署的功能,在客户端输入信号,信号到达 Web 服务器 ...
- react-redux的Provider和Connect的引发的思考
react是当下非常流行的JS框架,react秉承的设计原则是一切皆组件:react-redux是react中使用redux的桥接工具,react-redux也继承react的设计原则,使用组件的形式 ...