`

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

 
阅读更多

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

倒计时器场景

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

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

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

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

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

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

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

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

使用count—的代码实现

模拟不同部门的线程:

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

模拟总控室的主线程:

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

运行结果:

从运行结果,我们可以看到,当总控室接收到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的时候,表示所有的线程都执行完毕了。然后再闭锁上等待的其他线程就可以恢复正常工作了。

来看看主要的方法

说明:

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

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

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

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

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

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

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

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

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

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

查看运行结果:

 

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

使用场景:

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

比如:

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

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

关注凯哥:

个人博客:www.kaigejava.com

个人公众号:凯哥Java(kaigejava)

 

1
1
分享到:
评论

相关推荐

    CountDownLatch、Semaphore等4大并发工具类详解

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    java多线程tcpsocketserver源码-netty-learning:网络学习

    java多线程tcp socket server源码@Netty 笔记 1. 内蒂 网络应用框架 特征 设计 支持多种传输类型 事件模型 高度可定制的线程模型 表现 高吞吐量,低延迟 更少的资源消耗 最小化内存拷贝 安全SSL/TLS 支持 建筑学 核 ...

    html5 svg火箭升空动画场景特效.zip

    在这个场景中,开发者可能会使用CSS3的`@keyframes`规则来定义火箭升空的各个阶段,包括火箭的上升、火焰的喷射以及背景的动态变化。通过改变透明度、位置、大小等属性,可以实现火箭从静止到加速升空,火焰从弱到强...

    简单java打字游戏,非常适合java初学者自娱自乐

    从给定的文件信息来看,这是一款基于Java的简单打字游戏代码,旨在帮助Java初学者通过实践加深对编程的理解,同时在游戏中提升打字技能。接下来,我们将详细解析这款游戏中涉及的关键知识点。 ### Java Applet ...

    个人习作火箭车

    总体来说,《个人习作火箭车》展示了开发者在J2ME平台上进行游戏开发的技能和创造力,从编程逻辑到艺术设计,都体现了开发者对游戏制作的热爱和执着。尽管作为业余作品,但它无疑是一个学习和展示Java移动游戏开发的...

    java 字符火箭

    用字符组成火箭图案,可以改变size来变化不同长度,美国css作业类型题之一

    java发射demo

    Java发射技术,主要指的是Java反射(Reflection)机制,它是Java编程语言中的一种强大的工具,允许程序在运行时检查和操作类、接口、字段以及方法等信息。反射在Java中扮演着重要的角色,尤其是在动态类型语言的支持...

    六自由度火箭_火箭模型matlab_火箭_火箭3自由度_rocket_火箭控制_

    在航空航天领域,火箭模型的研究是至关重要的,尤其是在设计和优化飞行控制系统时。...在“六自由度火箭”项目中,我们可以期待看到更多关于火箭动力学、控制策略以及MATLAB应用的深度研究和实践。

    火箭样式柱形图制作教程.rar

    总的来说,这个火箭样式柱形图制作教程将引导你通过一系列步骤,从设计独特的火箭图形,到结合数据和动画,创造出一个既美观又实用的数据可视化工具。熟练掌握这些技巧,你将在下次的演示中脱颖而出,让观众对你的...

    某火箭炮闭锁机构工作性能分析 (2015年)

    为了保证某火箭炮闭锁机构具有统一的闭锁力,提出了一种施加闭锁机构预紧力的控制方法。通过试验测试了闭锁机构闭锁力的大小,结果表明该控制方法可靠,闭锁机构的闭锁力达到设计值;为了研究闭锁机构发射条件下的...

    易语言火箭发射特效

    在这个“易语言火箭发射特效”项目中,我们主要探讨的是如何使用易语言来实现一个火箭发射的视觉特效。这个特效可能在游戏开发、模拟演示或者教学示例等场景中有所应用。 首先,我们需要理解火箭发射的基本过程。...

    基于面向对象技术的长征二号f火箭应急救生共5页.pdf.z

    这种文档通常会涵盖系统的需求分析、类与对象的设计、接口定义、继承和多态性等面向对象编程的关键要素,以及如何将这些原理应用于火箭的应急救生系统中,以提高系统的可靠性和可维护性。 【标签】"基于面向对象...

    java烟花动态程序.zip

    【Java烟花动态程序】是一个基于Java编程语言实现的可视化项目,它通过...通过这个项目,开发者不仅可以学习到Java基础,还能深入理解图形界面编程、对象设计、动画原理和并发控制等高级技术,提升编程技巧和艺术感。

    JAVA线程的两种创建方式及优劣比较.pdf

    Java线程是多任务编程的重要组成部分,它允许程序同时执行多个任务。在Java中,有以下两种主要的方式来创建和管理线程: 1. **通过实现Runnable接口创建线程** 实现Runnable接口是一种推荐的创建线程的方式,因为...

    火箭图标返回页面顶部

    【火箭图标返回页面顶部】是一种常见的网页交互设计,它允许用户快速便捷地回到网页的起始位置,通常在页面滚动到一定距离后显示。在这个场景中,我们关注的是使用jQuery实现这一功能,jQuery是一个强大的JavaScript...

    java星月交替_java_

    这个小程序可能结合了多线程、图形绘制和时间控制等技术,使得程序运行时能够动态地展示星空的变化,给用户带来一种火箭升空或是夜晚天体变化的视觉体验。 首先,我们来讨论一下Java中的图形用户界面。Java提供了...

    QT语言动态火箭实现

    在Qt中,可以使用QGraphicsView和QGraphicsScene来创建2D图形场景,火箭和其他游戏元素作为QGraphicsItem子类进行绘制和交互。开发者可能使用定时器(QTimer)来控制火箭的运动间隔,通过更新火箭的位置和状态来实现...

    烟花豪情绽放java特效

    在IT行业中,特效编程是一种非常吸引人的领域,特别是在可视化和用户体验设计中。"烟花豪情绽放java特效"这个主题,正是这样一个将编程...对于想要学习Java图形编程或者特效制作的开发者来说,这是一个很好的学习案例。

    91.(cesium篇)cesium火箭发射模拟.rar

    该资源包的执行效果查看地址:https://blog.csdn.net/m0_60387551/article/details/123184049 “地图之家”专栏中的“91.(cesium篇)cesium火箭发射模拟”。如下载有问题,可联系博主。 解压密码:cesium

    火箭车复刻版godot源码,仅参考学习

    在Godot中,通常会有多个文件,如场景文件(.tscn)、脚本文件(.gd或.cs)、资源文件(.res)等,这些可能被包含在这个"火箭车"的文件夹或项目中。 【知识点概览】 1. **Godot引擎介绍**:包括引擎的安装、工作...

Global site tag (gtag.js) - Google Analytics