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

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

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使用线程并发库模拟弹夹装弹以及发射子弹的过程的更多相关文章

  1. Java多线程与并发库高级应用-java5线程并发库

    java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包 ...

  2. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  3. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  4. 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

    1.  HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...

  5. 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析

    1.  java5线程并发库新知识介绍 2.线程并发库案例分析 package com.itcast.family; import java.util.concurrent.ExecutorServi ...

  6. java--加强之 Java5的线程并发库

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...

  7. Java中的线程--并发库中的集合

    线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合... 一.可堵塞队列 队列包含固定长度的队列和不固定长度的队列 ArrayBlockQueue中只有put()方法和take()方法才 ...

  8. Java多线程(六) —— 线程并发库之并发容器

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...

  9. Java多线程(三) —— 线程并发库之总体架构

    对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...

随机推荐

  1. 创建Cordova项目 报错Error: Unhandled "error" event

    cordova版本7.0以上版本 创建cordova项目错误信息 Error: Unhandled "error" event. (  Error from Cordova Fet ...

  2. JavaScript--事件绑定及深入(26)

    // 事件绑定分为两种: // 一种是传统事件绑定(内联模型/脚本模型);上一章内容; // 一种是现代事件绑定(DOM2级模型);现代事件绑定在传统事件绑定基础上提供了更强大的功能; 一 传统事件绑 ...

  3. MSCRM中报表开发一:创建基于SQL报表

    1.       新建报表项目.打开SQL Server Business Intelligence Development Studio,点击 文件 > 新建 > 项目,项目类型选择 商 ...

  4. 学习笔记(2)——实验室集群LVS配置

    查看管理结点mgt的网卡信息,为mgt设置VIP [root@mgt ~]# ifconfig eth0 Link encap:Ethernet HWaddr 5C:F3:FC:E9:: inet a ...

  5. Linux CentOS 6.5 下 vsftpd ftp服务器搭建

    Linux CentOS 6.5 下 vsftpd ftp服务器搭建 by:授客 QQ:1033553122   操作系统环境:CentOS 6.5-x86_64 下载地址:http://www.ce ...

  6. 【Redis】Redis学习(六) Redis 基本运维

    Redis的单机搭建,主从搭建,Sentinal搭建,以及Redis集群搭建的步骤参照前面的文章.现在来说一下Redis的基本运维,毕竟如果一切正常是最好的,但是当出现问题不能使用的时候,准确定位问题 ...

  7. [随时更新] Git的过滤规则 .gitignore 配置

    往github上传代码的时候,很多文件没必要都传,这就需要在.gitignore文件里配置一下过滤规则.在此记录一下各种项目的配置参数,先从最近做的android开始. 原文地址请保留http://w ...

  8. 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础

    ---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...

  9. python自学——文件处理(截取文件内容)

    #截断文件内容使用的函数为truncate()来截断文件中的内容# 注意当truncate()括号内没有定义对象时则会删除文件内容:当括号内为指定某个条件时文件会截取从0到指定位置的内容f=open( ...

  10. Unity By Reflection Update Scripts

    App热更新需求 我正在使用Unity 3D开发一个Android的应用,它会下载AssetBundles并加载它们的内容,但由于AssetBundles不能包含脚本,我将使用预编译的C#脚本,并使用 ...