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 ...
随机推荐
- Linux常用基本命令(chmod)
chmod命令用来改变文件或者目录的权限,只有文件的属主和超级用户才能够执行这个命令 格式: chmod [option] [mode] [file] >常用参数选项 -R : 递归修改目录以及 ...
- HDU4292(KB11-H 最大流)
Food Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Mac安装Vue-cli时 提示bash: vue: command not found问题
1: 首先执行sudo npm install --global vue-cli 2: 复制的路径地址为添加环境变量的地址 3:添加环境变量 export PATH="$PATH:( ...
- promise的理解和应用
老铁们,我又满血复活了,今天我准备来吹一波我对promise,如有错吴请直接指出,明白了吗?话不多说开始吧 首先我们需要知道啥叫promise,我问了问大佬,他说这个东西是 异步操作的同步代码(but ...
- 【代码笔记】iOS-产生随机数
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- IntelliJ idea 备份与恢复
为了防止突然断电或者电脑突然关机导致idea恢复出厂设置,需要定期备份配置. 一.备份 File---Export Settings 将settings.jar 文件导入到C:\Users\xutin ...
- 安卓开发_浅谈ListView(ArrayAdapter数组适配器)
列表视图(ListView)以垂直的形式列出需要显示的列表项. 实现过程:新建适配器->添加数据源到适配器->视图加载适配器 在安卓中,有两种方法可以在屏幕中添加列表视图 1.直接用Lis ...
- 关于kernel-devel、kernel-header和kernel src的区别
A kernel-header package would contain 'header files' needed by some applications which would be buil ...
- 创建SQL Server数据库集群的经历
自己尝试安装SQL Server集群和配置AlwaysOn可用性组,服务器系统是Windows Server 2012 R2,SQL Server是2014企业版,我的环境是一台服务器,然后用Hype ...
- 【待补充】[Spark Core] Spark 实现标签生成
0. 说明 在 IDEA 中编写 Spark 代码实现将 JSON 数据转换成标签,分别用 Scala & Java 两种代码实现. 1. 准备 1.1 pom.xml <depend ...