Java使用线程并发库模拟弹夹装弹以及发射子弹的过程

同样是从网上看到的一个需求,需求描述都在代码中。

不多说了,直接贴代码了。相信大家都能够看得懂的!

package cn.yw.bore;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 使用多线程模拟多线程装弹及射出的过程(实际上这是一个生产者与消费者的问题)* * 要求:*  1.开启3个线程装弹,开启2个线程发射子弹*  2.弹夹最多只能够装载12颗子弹*  3.一次只能够发射一枚子弹,发射子弹的时候不能进行装弹,在装弹的时候不能进行发射。*  4.整个过程就是“装载”、“发射”、“装载”、“发射”、“装载”、“发射”* @author yw-tony**/
public class ClipTest {public static void main(String[] args){final BoreManager manager = new BoreManager();//开启3个线程装弹for(int i=0;i<3;i++){new Thread(new Runnable(){@Overridepublic void run() {while(true){manager.loading();}}}).start();}//开启两个线程进行发射for(int i=0;i<2;i++){new Thread(new Runnable(){@Overridepublic void run() {while(true){manager.send();}}}).start();}}/*** 模拟装弹以及发射的管理类* @author yw-tony**/static class BoreManager{int boreCount = 1;boolean flag = false;//线程开启标记//队列中对多存储12个子弹ArrayBlockingQueue<Integer> blocking = new ArrayBlockingQueue<Integer>(12);
//        List<Integer> blocking = new ArrayList<Integer>();Lock lock = new ReentrantLock();Condition cond1 = lock.newCondition();Condition cond2 = lock.newCondition();/*** 发射*/public void send(){lock.lock();try{if(!flag){cond1.await();}if(blocking.size() == 0){flag = false;cond2.signal();}else{Integer i = blocking.take();System.out.println("发射第:"+i+"个子弹!");blocking.remove(i);//将该元素从队列中移除Thread.sleep(100);//模拟子弹发射的慢过程
                }}catch(Exception e){e.printStackTrace();}finally{lock.unlock();}}/*** 装载*/public void loading(){lock.lock();try{if(flag){cond2.await();}if(blocking.size()==12){flag = true;cond1.signal();}else{blocking.put(boreCount);System.out.println("第:"+boreCount+"个子弹装载完成!");Thread.sleep(100);//模拟装弹慢过程boreCount++;}}catch(Exception e){e.printStackTrace();}finally{lock.unlock();}}}
}

 

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

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

相关文章

计算机结构原理初步教案板书设计,(计算机工作原理)教学设计(教案)

《(计算机工作原理)教学设计(教案)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《(计算机工作原理)教学设计(教案)(5页珍藏版)》请在人人文库网上搜索。1、计算机系统的基本组成教学设计基本信息学 科信息技术年 级初二教学形式多媒体教学教 师彭裕红单 位梅州市梅…

U-Boot 移植

目录NXP官方开发板uboot编译测试查找NXP官方的开发板默认配置文件_defconfig配置编译NXP官方开发板对应的uboot烧写验证与驱动测试(定位缺少的驱动)在NXP官方U-Boot 中添加自己的开发板添加开发板默认配置文件添加开发板对应的头文件(mx6ull_alientek_emmc.h)添加开发板对应的板…

江苏计算机信息录入技师选拔考试题,2010年江苏省机关事业单位工人技师资格选拔考试试卷...

考题2010年江苏省机关事业单位工人技师资格选拔考试试卷计算机一、单项选择题1.计算机之所以能按人们的意志自动进行工作&#xff0c;最直接的原因是因为采用()A&#xff0e;二进制数制 B.高速电子元件 C.存储程序控制 D.程序设计语言2.十进制数269转换为十六进制数为()A&#…

打印某个进程下的所有线程--Linux环境

2019独角兽企业重金招聘Python工程师标准>>> 1、ps -mp <进程ID> -o THREAD 在当前用户下&#xff0c;列出pid包含的所有线程。 2、ps -mp <进程ID> -o THREAD,tid 在当前用户下&#xff0c;列出pid包含的所有线程信息及本地线程ID (tid)。 3、ps -…

JavaScript笔记(3)

•位操作符 所有的按位操作符的操作数都会被转成补码形式的有符号的32位整数。 运算符用法描述按位与&#xff08;AND&#xff09;a & b对于每一个比特位&#xff0c;只有两个操作数相应的比特位都是1时&#xff0c;结果才为1&#xff0c;否则为0。按位或&#xff08;OR&am…

转 常见hash算法的原理

散列表,它是基于快速存取的角度设计的&#xff0c;也是一种典型的“空间换时间”的做法。顾名思义&#xff0c;该数据结构可以理解为一个线性表&#xff0c;但是其中的元素不是紧密排列的&#xff0c;而是可能存在空隙。 散列表&#xff08;Hash table&#xff0c;也叫哈希表&a…

Linux 内核顶层Makefile 详解

目录前602行分析make xxx_defconfig 过程Makefile.build 脚本分析make 过程built-in.o 文件编译生成过程make zImage 过程前几章我们重点讲解了如何移植uboot 到I.MX6U-ALPHA 开发板上&#xff0c;从本章开始我们就开始学习如何移植Linux 内核。同uboot 一样&#xff0c;在具体…

android第三次作业

界面&#xff1a; 主要代码&#xff1a; 1.定义一个工具类&#xff0c;在这个类中获取音频文件&#xff0c;并且对歌曲名、歌手和时间等进行格式规范&#xff1a; package com.example.administrator.music;import android.content.Context; import android.database.Cursor; i…

2013年国家计算机一级考试试题,2013年计算机一级的考试试题.doc

2013年计算机一级的考试试题.doc2013年计算机一级考试试题一、单项选择题1、 把计算机分巨型机、大中型机、小型机和微型机&#xff0c;本质上是按_____划分。A 计算机的体积 B CPU的集成度C 计算机总体规模和运算速度 D 计算机的存储容量2、 以微处理器为核心组成的微型计算机…

python try 异常处理 史上最全

在程序出现bug时一般不会将错误信息显示给用户&#xff0c;而是现实一个提示的页面&#xff0c;通俗来说就是不让用户看见大黄页&#xff01;&#xff01;&#xff01; 有时候我们写程序的时候&#xff0c;会出现一些错误或异常&#xff0c;导致程序终止. 为了处理异常&#xf…

Spring+Spring Security+JSTL实现的表单登陆的例子

2019独角兽企业重金招聘Python工程师标准>>> Spring Security允许开发人员轻松地将安全功能集成到J2EE Web应用程序中&#xff0c;它通过Servlet过滤器实现“用户自定义”安全检查。 在本教程中&#xff0c;我们将向您展示如何在Spring MVC中集成Spring Security 3…

数学教师计算机能力提升,深度融合信息技术,提升数学课堂魅力

原标题&#xff1a;深度融合信息技术&#xff0c;提升数学课堂魅力2018年小学数学教学与信息技术深度融合专题网络教研活动2018年10月31日&#xff0c;我校数学科组根据北片指导中心文件精神&#xff0c;进行了一次小学数学教学与信息技术深度融合专题网络教研活动。本次教研活…

Linux 内核启动流程

目录链接脚本vmlinux.ldsLinux 内核入口stext__mmap_switched 函数start_kernel 函数rest_init 函数init 进程看完Linux 内核的顶层Makefile 以后再来看Linux 内核的大致启动流程&#xff0c;Linux 内核的启动流程要比uboot 复杂的多&#xff0c;涉及到的内容也更多&#xff0c…

vs文件上传失败--超过最大字符限制

一、问题 在文件上传时&#xff0c;会遇到大文件上传失败。 》F12查看报错网络请求返回结果 》问题分析 由于vs上传文件默认的字符大小控制。 二、解决方法 》在web.config中修改或添加最大允许上传文件的大小 1 <system.web> 2 <httpRuntime targetFramework&q…

为什么linux默认都没有MP3和视频或者连FLASH都没有呢?

为什么linux默认都没有MP3和视频或者连FLASH都没有呢&#xff1f;这是转自官方的说明。先后明&#xff0c;后面讲一下如何动手来让LINUX支持这些最基本的功能&#xff01;为什么 Fedora 没有包含对专有格式例如 MP3 或 MPEG 的支持&#xff1f; MP3 和 MPEG 格式受专利保护&…

微计算机和微处理器的区别,CPU和微处理器的区别

CPU和微处理器是成功操作系统的基础。它们都执行不可或缺的计算机任务&#xff0c;例如算术&#xff0c;数据处理&#xff0c;逻辑和I / O操作&#xff0c;但是CPU与微处理器的区别并不是那么黑与白。尽管一些IT管理员可以互换使用CPU和微处理器&#xff0c;但现实是大多数CPU是…

单例模式创建的两种方法

package com.wetuo.javabase; public class SingletonDemo {private static SingletonDemo instance new SingletonDemo();private SingletonDemo() {}public static SingletonDemo getInstance() {return instance;}//充血模式} 方法二 public class SingletonDemo {private …

java 8 新特性之日期-时间 API

Date-Time API简介 在Java8之前的版本中&#xff0c;我们处理时间类型常常使用的是java.util包下的Date类。但使用Date类却有诸多的弊端&#xff0c;如&#xff1a; java.util.Date 是非线程安全的&#xff0c;所有的日期类都是可变的&#xff1b;日期/时间类的定义并不一致&am…

向日葵在mac不能以服务器运行吗,mac远程桌面连接在哪?向日葵可以实现mac远程连接吗?...

目前大部分用户的电脑都是Windows系统的&#xff0c;也有部分用户用的Mac电脑&#xff0c;对于Mac电脑用户来说&#xff0c;许多操作与Windows都不同&#xff0c;比如他们就不知道mac远程桌面连接在哪?当遇到需要别人远程帮助时就无法调出&#xff0c;下面小编给大家讲解下它的…

根文件系统构建(BusyBox方式)

目录根文件系统简介BusyBox构建根文件系统BusyBox简介编译BusyBox构建根文件系统(生成bin、sbin、usr、linuxrc)向根文件系统添加lib库创建其他文件夹根文件系统初步测试完善根文件系统创建/etc/init.d/rcS文件创建/etc/fstab文件创建/etc/inittab文件根文件系统其他功能测试软…