这篇文章主要介绍了实例讲解Java并发编程之闭锁,闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过,需要的朋友可以参考下

闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,初始化为一个正式,正数表示需要等待的事件数量。countDown方法递减计数器,表示一个事件已经发生,而await方法等待计数器到达0,表示等待的事件已经发生。CountDownLatch强调的是一个线程(或多个)需要等待另外的n个线程干完某件事情之后才能继续执行。

场景应用:

10个运动员准备赛跑,他们等待裁判一声令下就开始同时跑,当最后一个人通过终点的时候,比赛结束。10个运动相当于10个线程,这里关键是控制10个线程同时跑起来,还有怎么判断最后一个线程到达终点。可以用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。

import java.util.concurrent.CountDownLatch;

class Aworker implements Runnable {

private int num;

private CountDownLatch begin;

private CountDownLatch end;

public Aworker(int num, final CountDownLatch begin, final CountDownLatch end) {

this.num = num;

this.begin = begin;

this.end = end;

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

System.out.println(num + "th people is ready");

begin.await(); //准备就绪

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

end.countDown(); //计数器减一,到达终点

System.out.println(num + "th people arrive");

}

}

}

public class Race {

public static void main(String[] args) {

int num = 10;

CountDownLatch begin = new CountDownLatch(1);

CountDownLatch end = new CountDownLatch(num);

for (int i = 1; i <= num; i++) {

new Thread(new Aworker(i, begin, end)).start();

}

try {

Thread.sleep((long) (Math.random() * 5000));

} catch (InterruptedException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

System.out.println("judge say : run !");

begin.countDown(); //裁判一声令下开始跑

long startTime = System.nanoTime();

try {

end.await(); //等待结束

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

long endTime = System.nanoTime();

System.out.println("judge say : all arrived !");

System.out.println("spend time: " + (endTime - startTime));

}

}

}

输出

1th people is ready

2th people is ready

4th people is ready

6th people is ready

3th people is ready

10th people is ready

8th people is ready

5th people is ready

7th people is ready

9th people is ready

judge say : run !

1th people arrive

4th people arrive

10th people arrive

5th people arrive

2th people arrive

judge say : all arrived !

9th people arrive

7th people arrive

8th people arrive

3th people arrive

6th people arrive

spend time: 970933

闭锁java_实例讲解Java并发编程之闭锁相关推荐

  1. java 并发 变量_实例讲解Java并发编程之变量

    编写线程安全需要关心的: 1.共享的变量 2.可变的变量 共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变. 例如以下count 变量: //线程不安全的类 public class ...

  2. 详细讲解Java并发编程

    转自:微点阅读  https://www.weidianyuedu.com volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用 ...

  3. fusion 360安装程序的多个实例正在同时运行。_阿里架构师实例讲解——Java多线程编程;详细的不能再详细了...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  4. 【Java并发编程】闭锁

    (转自:https://www.cnblogs.com/xujian2014/p/5359684.html#_label5 侵删) 1.什么是闭锁? 闭锁(latch)是一种Synchronizer( ...

  5. 《Java并发编程之美》

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)] [外链图片转存失败,源站 ...

  6. 我肝了2个月,为你整理了Java并发编程手册

    从原理到实战,全面讲解Java并发编程核心知识,你值得拥有的Java并发编程手册. 如何看待程序员35岁职业危机? Java全套学习资料(14W字),耗时半年整理 我肝了三个月,为你写出了GO核心手册 ...

  7. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    转 自: Java并发编程笔记之 CountDownLatch闭锁的源码分析 ​ JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 C ...

  8. Java 并发编程系列之闭锁(CountDownLatch)

    在讲闭锁之前,我们先来思考一个问题:在多线程环境下,主线程打印一句话,如何保证这句话最后(其他线程全部执行完毕)打印? 博主目前可以想到的实现方式有两种.一种是通过 join() 方法实现,另一种就是 ...

  9. java闭锁_【Java并发编程三】闭锁

    1.什么是闭锁? 闭锁(latch)是一种Synchronizer(Synchronizer:是一个对象,它根据本身的状态调节线程的控制流.常见类型的Synchronizer包括信号量.关卡和闭锁). ...

最新文章

  1. 专题 20 常用调试技术
  2. nodejs async
  3. 无服务器架构 - 从使用场景分析其6大特性
  4. python flask restful api_python之restful api(flask)获取数据
  5. 走路!不要跑步!不生病的秘密!
  6. Qt Creator 预览QtCreator中的界面
  7. JVM程序计数器,虚拟机栈,本地方法栈
  8. UVA10191 Longest Nap【排序】
  9. 推荐Android中两个很好用的banner,可无限轮播,可使用第三方图片加载框架加载网络图...
  10. iOS终于能微信双开了!原理竟然是这样…
  11. 均线颜色怎么区分_均线入门:一图学会区分不同均线的颜色与炒股技巧
  12. 【Linux 0.11】第九章 块设备驱动程序
  13. MVC+knockoutjs知识点总结
  14. pyth命令_如何:在Windows上设置用于从命令行运行.py文件的Python可执行文件
  15. CWnd::WindowProc的理解
  16. 三菱plc恒压供水程序+威纶触摸屏程序 以控制水泵一用一备、一拖二、一拖三、一拖四、一拖四带小泵恒压功能
  17. Application Loader上传app,一直卡在“正在通过 App Store 进行鉴定”
  18. jenkins构建失败后将信息发送到企业微信
  19. python 如何爬取王者荣耀全英雄皮肤
  20. Spine 骨骼动画查看器 Skeleton Viewer_官方文档中文版

热门文章

  1. 2023 年的 Web Worker 项目实践
  2. 双线性 双三次 和基于lanczos 的插值算法
  3. 解决 FileNotFoundError: [WinError 2] 系统找不到指定的文件
  4. NGFF接口标准, 或在今年大放异彩
  5. SPP(Spatial Pyramid Pooling)解读
  6. Windows OpenGL 图像色调
  7. 常用的计算机中开机键是什么,按下电脑开机键,电脑内部都做了哪些事
  8. js实现轮播图(简单滚动轮播)
  9. PHP 删除COOKIE 方法
  10. 如何选择Java培训机构?