1.

@Data
public abstract class BaseLatch {
private int limit;
protected int running; BaseLatch(int limit) {
this.limit = limit;
running = limit;
} public abstract void await() throws InterruptedException; public abstract void await(long ms) throws InterruptedException, TimeoutException; public abstract void countDown();
} class CountDownLatch extends BaseLatch { public CountDownLatch(int limit) {
super(limit);
} @Override
public void await() throws InterruptedException {
synchronized (this) {
while (this.running > 0) {
this.wait();
}
}
} @Override
public void await(long ms) throws InterruptedException, TimeoutException {
Assert.isTrue(ms > 0, "不允许小于0");
final long endTime = System.currentTimeMillis() + ms;
synchronized (this) {
while (this.running > 0) {
long balanceTime = endTime - System.currentTimeMillis();
if (balanceTime <= 0) {
throw new TimeoutException();
}
this.wait(balanceTime);
}
}
} @Override
public void countDown() {
synchronized (this) {
if (this.running <= 0) {
throw new IllegalStateException("");
}
this.running--;
this.notifyAll();
}
}
} class LatchTest {
public static void main(String[] args) throws InterruptedException {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Work<Integer>[] works = new Work[2];
BaseLatch latch = new CountDownLatch(works.length);
for (int i = 0; i < works.length; i++) {
works[i] = new Work<Integer>(latch);
new Thread(works[i]).start();
}
try {
latch.await(5000);
} catch (TimeoutException ex) { }
for (int i = 0; i < works.length; i++) {
System.out.println(works[i].getResult());
}
stopWatch.stop();
System.out.println("共消耗时间:" + stopWatch.getTotalTimeSeconds() + "秒");
}
} class Work<T> extends Thread {
private BaseLatch latch;
private T result; public Work(BaseLatch latch) {
this.latch = latch;
} @Override
public void run() {
try {
Random random = new Random();
int ms = random.nextInt(10) + 1;
Thread.sleep(1000 * ms);
this.result = (T) (Object) ms;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
} public T getResult() {
return result;
}
}

2.可能的输出如下

null
2
共消耗时间:5.012秒

CountDownLatch的简单实现的更多相关文章

  1. CountDownLatch的简单使用

    from https://www.jianshu.com/p/cef6243cdfd9 1.CountDownLatch是什么? CountDownLatch是一个同步工具类,它允许一个或多个线程一直 ...

  2. CountDownLatch的简单讲解

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  3. CountDownLatch的简单理解

    CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用). CountDownLatch能够使一个 ...

  4. JAVA中CountDownLatch的简单示例

    public static void main(String[] args) throws InterruptedException { CountDownLatch latch =new Count ...

  5. CountDownLatch的原理学习

    转载:http://blog.csdn.net/yanyan19880509/article/details/52349056 前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过Co ...

  6. CountDownLatch 和 CyclicBarrier 的运用及实现原理

    I.CountDownLatch 和 CyclicBarrier 的运用 CountDownlatch: 定义: 其是一个线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所 ...

  7. java共享锁实现原理及CountDownLatch解析

    前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过CountDownLatch的学习来了解java并发包中是如何实现共享锁的. CountDownLatch使用解说 CountDow ...

  8. java高级---->Thread之CountDownLatch的使用

    CountDownLatch是JDK 5+里面闭锁的一个实现,允许一个或者多个线程等待某个事件的发生.今天我们通过一些实例来学习一下它的用法. CountDownLatch的简单使用 CountDow ...

  9. Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒

    java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...

随机推荐

  1. java如何集成支付宝移动快捷支付功能

    项目需要,需要在客户端集成支付宝接口.第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家.就研究了一下:因为使用支付宝接口,就需要到支付宝官 ...

  2. Electron 安装与使用

    Electron是使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用 本文基于Windows进行开发的过程,记录下来,以便日后使用,Electron官网:https://elec ...

  3. WebClient使用与IIS7最大上传文件--升级&引导窗口&目录同步完整解决方法

    IIS7最大上传文件说明:http://www.mzwu.com/article.asp?id=2449 WebClient使用说明使用using  及时回收资源 using(var wc=new W ...

  4. awk基础04-内置函数

        在awk中常用的内置函数大概分为:数值函数.字符函数.时间函数.二进制操作函数.数组函数.自定义函数等. 数值函数   常用的数值函数主要有int.rand.srand.sqrt等.详细如下所 ...

  5. Linux 基础教程 25-命令和文件查找

    which     不管是在Windows还是Linux系统中,我们都会偶尔执行一些系统命令,比如Windows常见的cmd.ping.ipconfig等,它们的位置都在%systemdrive%中. ...

  6. handsontable-utilities

    搜索值 鼠标右键 讲了四个功能:1.row header是否可以右键(rowheader:true):2.删除右键列表的某些值(通过数组定义):3.自定义右键列表和功能(callback,item两个 ...

  7. CentOS 新系统后配置

    1. 网络配置 略 1.2 ip_froward 查看 sysctl -a | grep ip_ 修改 vi /etc/sysctl.conf net.ipv4.ip_forward = 1 最大使用 ...

  8. ASP.NET 生成缩略图片类分享

    /// <summary> /// 生成图片缩略图 指定文件路径生成 /// </summary> public static void SaveImage(String fu ...

  9. css3 animation动画使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. ecshop后台0day漏洞原理+利用方法 XSS+Getshll

    发布日期:2012-10.25 发布作者:dis9@ztz 漏洞类型:跨站攻击 代码执行 0x0 后台getshell 在 includes/cls_template.php fetch函数 /** ...