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 ...
随机推荐
- JS touch
一个月没写博客了,感觉空唠唠的,有多好想写的,今天全都给补上吧,记录最近这个月的收获 https://blog.csdn.net/sinat_19327991/article/details/7382 ...
- idea中连接oracle数据库打包
问题:在使用idea连接oracle数据时发现oracle.jdbc.OracleDriver引用这个包报错,找不到包.解决方法:在idea的terminal命令框中输入如下命令.我的jar包的位置在 ...
- windows环境下IP多访问
1.E:\wamp64\bin\apache\apache2.4.23\conf\extra\httpd-vhosts.conf 添加: <VirtualHost *:80> Server ...
- 使用标准C读取文件遇到的结构体对齐问题及其解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 同事使用标准C库读取文件,发现总是读取不对,让我帮忙看一下. 原来他定义了如下一个结构体: // 定义块的结构 typ ...
- PeopleSoft面试题(服务器相关)
如何配置app服务器与web服务器的负载均衡?请详细说明. App Server: 在配置App Server负载均衡时候,通过webserv目录下的configuration.properties文 ...
- 声明元素<%! %>、Scriptlet元素<% %>、表达式元素<%= %>、注释元素、输出特殊符号<%和%>
声明元素 <%! 类成员声明或方法声明 %> 在声明元素中编写的代码,将转译为Servlet中的类成员或方法. 重新定义jspInit()方法,或是在jspDestroy(),就是在声明元 ...
- Android 监听手机GPS打开状态
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854942 本文出自[赵彦军的博客] GPS_Presenter package ...
- java基础(十一) 枚举类型
枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...
- JavaScript语法详解:if语句&for循环&函数
本文首发于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. if语句 最基本的if语句 if语句的结构体:(格式) if (条件表达式) ...
- QT学习2
一.常用控件与常用的功能函数. QDialog.QMainWindow.QPushButton.QLabel.QLineEdit 构造函数指定父容器.setText,getText,size,res ...