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(){
- @Override
- public void run() {
- while(true){
- manager.loading();
- }
- }
- }).start();
- }
- //开启两个线程进行发射
- for(int i=0;i<2;i++){
- new Thread(new Runnable(){
- @Override
- public 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();
- }
- }
- }
- }
Java使用线程并发库模拟弹夹装弹以及发射子弹的过程的更多相关文章
- Java多线程与并发库高级应用-java5线程并发库
java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包 ...
- 使用Java线程并发库实现两个线程交替打印的线程题
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
1. HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...
- 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析
1. java5线程并发库新知识介绍 2.线程并发库案例分析 package com.itcast.family; import java.util.concurrent.ExecutorServi ...
- java--加强之 Java5的线程并发库
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...
- Java中的线程--并发库中的集合
线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合... 一.可堵塞队列 队列包含固定长度的队列和不固定长度的队列 ArrayBlockQueue中只有put()方法和take()方法才 ...
- Java多线程(六) —— 线程并发库之并发容器
参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...
- Java多线程(三) —— 线程并发库之总体架构
对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...
随机推荐
- HDU3622(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 绘图:Matplotlib
用于绘制一些数据图,同学推荐的,挺好用.非常好的官网文档:http://matplotlib.org/contents.html 0. 安装 可以直接pip install,还有一些依赖就按照提示来吧 ...
- python学习之老男孩python全栈第九期_day009知识点总结
'''# len# 计算字符串的长度# s = '金老板小护士'# len(s)# 不能用 len 怎么办#low一点的方法# count = 0# for i in s:# count += 1# ...
- Django Rest framework 之 视图
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- JavaScript 事件处理机制
DOM 事件流 DOM 是一个树型结构,当一个HTML元素产生一个事件时,该事件会在该元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件流.而事件传播的 ...
- IntelliJ idea 备份与恢复
为了防止突然断电或者电脑突然关机导致idea恢复出厂设置,需要定期备份配置. 一.备份 File---Export Settings 将settings.jar 文件导入到C:\Users\xutin ...
- FineReport新增多项目甘特图示例及操作
1.描述 我们在做报表的时候,往往想体现其中随着时间的变化而产生的项目进度的变化和其他相关的系统进展,每当这种时候甘特图便是其中的不二之选.FineReport新增的多项目甘特图可以说是满足了大多数的 ...
- iis7 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
cmd 输入 C:\Windows\Microsoft.NET\Framework\V4.0.30319\aspnet_regiis -i
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- [Android] 对自定义图片浏览器经常内存溢出的一些优化
首先关于异步加载图片可以参见 夏安明 的博客:http://blog.csdn.net/xiaanming/article/details/9825113 这篇文章最近有了新的更改,大概看了一下,内容 ...