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 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
随机推荐
- 微信小程序把玩(十)swiper组件
原文:微信小程序把玩(十)swiper组件 Android写过轮播图的痛楚只有写过的知道,相对还是比较麻烦的,并没有一个轮播图组件,有个ViewPage也需要自己定制,IOS则多用UIScroller ...
- 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画
原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...
- SQL SERVER中UPDLOCK ,READPAST使用
原文:SQL SERVER中UPDLOCK ,READPAST使用 SQL SERVER中中获取不重复数据: select top 1 * from orders with(UPDLOCK ,READ ...
- asp.net网站在手机浏览器上全屏显示
前段时间要把asp.net 网站,在手机上全屏浏览,发现总是小小的一块,不能全屏 后来发现 JQuery Mobile 中在开头都用 <meta name="viewport&quo ...
- How to Move SSL certificate from Apache to Tomcat
https://www.sslsupportdesk.com/how-to-move-ssl-certificate-from-apache-to-tomcat/ Apache uses x509 p ...
- 修改Maven的本地仓库地址
已经配置好的设定文件: 1.创建一个本地仓库的地址 2.修改Maven中conf目录下的settings.xml文件 在此处添加修改后的本地仓库的地址 3.打开cmd 输入mvn help:sys ...
- 读书笔记——《谁说菜鸟不会数据分析—Python篇》
最近刚读完一本新书,关注的公众号作者出的“谁说菜鸟不会数据分析—Python篇”,话说现在很多微信公众号大牛都在出书,这貌似是一个趋势.. 说说这本书吧,我之前看过一些网文,对于数据分析这一块也有过一 ...
- MAC电脑修改Terminal以及vim高亮显示
1. Terminal高亮显示 编辑~/.bash_profile文件,在末尾增加两行: export CLICOLOR= export LSCOLORS=exfxcxdxcxegedabagacad ...
- 附008.Kubernetes TLS证书介绍及创建
一 Kubernetes证书 1.1 TLS Kubernetes系统的各个组件需要使用TLS证书对其通信加密以及授权认证,建议在部署之前先生成相关的TLS证书. 1.2 CA证书创建方式 kuber ...
- tomcat实现
转载地址:https://blog.csdn.net/u014795347/article/details/52328221?locationNum=2&fps=1 以下代码纯属本人复制,而且 ...