java 计时器_Java多线程并发容器之并发倒计时器

从火箭发场景来学习Java多线程并发闭锁对象

倒计时器场景

在我们开发过程中,有时候会使用到倒计时计数器。最简单的是:int size = 5; 执行后,size—这种方式来实现。但是在多线程并发的情况下,这种操作会不安全的。举个现实中最典型的一个例子:火箭发射的案例。

大家都看过火箭发射的直播吧。火箭在发送的时候,有很多设备需要检查是否都准备就绪。在总控室得到所有设备都准备就绪后,才会下达发射的命令。我们也知道,火箭发射有很多设备需要检验,这不是一个部门一个一个检查的,而是多个部门协同配合实现的。如果把一个个部门看作不同的线程的话。我们就可以假设:

如果是一个部门一个一个设备检查,这就是单线程操作的;

如果是多个部门协同配合的话,就是多线程的。

所以说,在火箭发射前检查设备是 多线程情况下进行的。

我们也不知道,不同部门负责检查的设备的复杂度不同,速度不同,就会导致有些部门检查完成的快,有些部门检查完成的慢。这个过程我们可以理解为不同线程在竞争CPU资源的时候不同。

假设有5个部门同时协同工作,这5个部门的操作可以看作是一组操作。因为速度不同,那么总控室下达发射的命令是以哪个检查完毕为准呢?是A部门还是B部门或者D部门呢?都不是,总控室下达发射的命令是在得到5个部门都检查完毕后才会下达发射的命令。我们也可以理解为总控室在得到这一组(五个部门)都操作完成才执行的。此时总控室可以理解为一个线程,五个部门一组可以理解一个线程组。

从上面现实生活中的案例分析,我们来想想上面的操作用Java程序怎么实现 ?

使用count—的代码实现

模拟不同部门的线程:

27fed115f8a092971cf830063f51f384.png

我们先来看看常规的。使用count--的效果。

模拟总控室的主线程:

88f79505dc074ba7aeca7b6997202520.png

从上面代码中,我们可以看到当计数器count减到0的时候,总控室下达发射命令。这个从逻辑上来说,是正确的,没问题的。我们来看看运行结果:

运行结果:

c4c5ab02a6caefeaf308d8aceebfe3ba.png

从运行结果,我们可以看到,当总控室接收到count =0的指令后,认为各个部门都已经检查完毕了。所以就下达了发射命令。但是在最后,我们发现火箭已经发射了,部门4和5才想总控室汇报检查完毕,准备就绪。这种情况是很危险的。因为我们知道火箭的造价是很昂贵的而且凝聚了很多科研人员的心血。如果因为某个部门未检查完毕就发射而导致火箭发射失败或者坠落,在现实生活中,这种情况是不允许出现的。

那么这种情况,在Java中,怎么解决呢?可以使用countdownlatch这个对象来解决。

Countdownlatch

Countdownlatch是什么?

先来看看源码中怎么解释的:A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

什么意思呢?

简单的来说,是一个同步辅助工具类,运行一个或多个线程在等待其他线程完成一组操作后再接着执行的工具类。

实现的流程:

通过一个计数器来实现的,计数器的初始值就是要执行的线程的数量。每当一个线程执行完毕之后,计数器的值就会减一,当计数器的的减少到0的时候,表示所有的线程都执行完毕了。然后再闭锁上等待的其他线程就可以恢复正常工作了。

来看看主要的方法

ef929ac98c77b9e8d026ac4f7a3d91e9.png

说明:

Sync:是countdownlatch内部类,继承AbstractQueuedSynchronizer使用AQS状态来代替计数的。

有参构造器:public CountDownLatch(int count){}

await():等待方法。还有一个带参数重载的方法。

countdown():执行计数器减1操作的方法。

使用countdownlatch模拟火箭发射前准备代码:

我们来看看使用countdownlatch来模拟火箭发射前准备会不会出问题。

来看看模拟部门的线程代码:

9fb594645a26466f8cbc13185cc603bf.png

为了保证计数器减一操作不受子线程运行结果影响,讲count.coundDown()操作放在finally代码块里面。

再来看看总控室下达发射命令的主线程:

58999c817f415f6e941b0efb4867f5c1.png

在downLatch.await()之后,下达发射命令。

查看运行结果:

8a721cb4912e1ce46ddc8f6c23cc6cd0.png

我们可以看到,当所有部门都准备就绪后,总控室接收到完成的指令后,下达发射火箭命令。这个流程才是正常的。从运行结果来看也是正常的。

使用场景:

场景1:某线程在运行前需要等待其他N个线程执行完成之后在执行。

比如:

容器启动spring 容器的启动,需要初始化、bean装配、检查其他依赖等加载完毕之后,在主线程在继续执行;

在比如:电商中统计库存问题。我们知道,一个电商项目有很多分类,不同分类下的库存不一样。如果要统计当前剩余总库存。这个时候,就可以使用其他线程统计每个分类下的库存。等所有分类都统计完成之后,主线程在进行汇总操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Spring将AWS SQS用作JMS提供程序

最近AWS公布了新的客户端库,它实现了JMS 1.1规范 ,并使用他们的简单队列服务 (SQS)作为JMS提供者 (见杰夫巴尔的帖子在这里 )。 在我的文章中,我将向您展示如何设置Maven项目以使用Spring Frame…

netbeans7.4_带有NetBeans 7.1 RC 2的快速入门WebLogic 12c

netbeans7.4WebLogic服务器12c停运了几天。 它适用于“裸”的Java开发人员-精美的Fusion Middleware东西将继续沿线升至12c。 因此,这基本上是我要运行的版本。 今天,我为您提供一个最新的NetBeans 7.1(RC 2)和WebLogic的快速入门…

burpsuite全套使用教程

burpsuite 实验环境安装教程浏览器配置篇使用方法Target模块(目标模块)Proxy模块(代理模块)Spider模块(蜘蛛爬行)Scanner模块(漏洞扫描)Intruder模块decoder模块(编码模块)Comparer模块(比较器)RepeaterSequencer 实验环境 burpsuite1.733 win10 dvwa firefox 安装教程 第…

致我们曾经白嫖的网站

十分好用的在线工具网站,珍藏版,分享给你们 1.奶牛快传:用户体验更好的网盘工具。 最近开始使用的一款网盘工具,和百度网盘类似,不过没有下载速度的限制,并且可以支持自定义分享文件的下载次数(需要开会员)。 还有一点让我觉得比较舒服的是,你给别人分享文件,别人无…

java word模版填充_[转载]java向word模板中填充数据(总结)

使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区域(DataRegion),另一个叫做数据标签(DataTag)。一、 概念数据区域:是…

是时候抛弃Java 7 – JBoss EAP 6.4了!

这一周真是太棒了。 JBoss EAP 6.4已发布,并且在大量技术增强和新功能中 ,最大的是:Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后,Oracle将不再将Java SE 7的更新…

bzoj 3668 数位DP

收获: 1、如果有很多位操作,并且不包含-/等高级运算,那么可以一位一位考虑,如果求一个最优解,可以尝试逐位确定,这道题因为原始攻击值有范围,那么就需要数位DP。 1 /**************************…

常用的视频下载网站

视频已经成为生活中不可缺少的一部分,不搬运视频怎么在此基础上创新。 小视频下载 V视频助手 硕鼠视频下载 维棠视频下载 Apowersoft视频下载王 Video Grabber Eagleget视频下载 喜欢的朋友可以收藏一下,万一以后想用找不到就不能二次创新了!…

漏洞工具:nmap和nessus

NMAP NMAP(Network Mapper)是一款开放源代码的网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个主机也没有问题.Nmap以新颖的方式使用原始IP报文来发现网络上有一些主机,那些主机提供什么服务&…

问题:三元向量的比较

粉丝投来一个题目:要求用到函数调用,编写程序 题目内容: 如果语文数学两门课程的成绩,甲同学分别是80分和90分,乙同学是90分和80分,丙同学是70和60分,这时比较甲同学和乙同学的成绩,只能说语文较差,数学较好,综合到一起就属于无法比较,但对丙同学可以比较,可以…

mysql版本不同会导致语法错误码_神奇的 SQL,Group By 真扎心,原来是这样!

作者:青石路原文:cnblogs.com/youzhibing/p/11516154.htmlGROUP BY 后 SELECT 列的限制标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键、聚合函数(SUM …

在Windows XP使用LC5(L0phtCrack)

LC5简介: LC5是国外一种很有名的密码破解软件,能破解用LM加密的SAM。可用它猜解2000\Xp\2003密码。它是著名的美国计算机安全公司Stake出品的Window/Unix密码查找软件LC4/LC5。 使用方法: 1,在主机里新建用户名,密码…

C++ 在屏幕上用星号打印菱形

粉丝提问&#xff1a;C 在屏幕上用星号打印菱形 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void pr_start(int _num) {int n0;int i 0;for (n 1; n < 2*_num; n) {int temp n;if (n > _num){temp - 2 * (n - …

Android JNI入门第五篇——基本数据类型使用

前面讲到了java和native数据类型&#xff0c;这里就开始做一下使用&#xff1a; 第一步&#xff1a;新建工程 第二部&#xff1a;书写 java方法&#xff1a; [java] view plaincopyprint? public class NativeMethod { static { System.loadLibrary("com…

使用微信开发者工具添加小程序底部导航栏报错

粉丝求助&#xff1a; 示例图&#xff1a; 看了这个页面&#xff0c;很明显这个页面引用的路径都有问题。 解决办法&#xff1a;

应用“Cain Abel”实现DNS欺骗

环境的搭建&#xff1a; 1&#xff0c;在Windows 7安装IIS服务&#xff0c;访问www.baidu.com或其他任意站点&#xff0c;保存首页文件至本地wwwroot文件夹中&#xff1b; &#xff08;1&#xff09;打开控制面板&#xff0c;找到“程序”&#xff0c;点进去 点击“打开或关闭…

Android killer软件闪退的解决办法?

解决办法&#xff1a; 重新下载安装一个版本比较新的。

EditThisCookie使用

下载安装 http://www.cnplugins.com/uploads/plugins/201502/www.cnplugins.com_fngmhnnpilhplaeedifhccceomclgfbg_1_4_1_.crx从上面这个网址下载下来&#xff0c;下下来之后用Chrome插件伴侣制作成谷歌浏览器能直接添加的插件 使用 鼠标右键单击——>EditThisCookie&am…

eclipse中在类saolei.Test 中找不到main方法

粉丝提问&#xff1a;eclipse中在类saolei.Test 中找不到main方法 解决办法&#xff1a; eclipse设置自动保存或者CTRLS 建议使用更加智能的编译器IDEA

Cookie和会话Session

Cookie和会话Session Cookie Cookie是识别客户端的特定用户。 1.每次HTTP请求的时候&#xff0c;客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的&#xff0c;第一次创建Session的时候&#xff0c;服务端会在HTTP协议中告诉客…