packagecn.yw.bore;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/*** 使用多线程模拟多线程装弹及射出的过程(实际上这是一个生产者与消费者的问题)

*

* 要求:

* 1.开启3个线程装弹,开启2个线程发射子弹

* 2.弹夹最多只能够装载12颗子弹

* 3.一次只能够发射一枚子弹,发射子弹的时候不能进行装弹,在装弹的时候不能进行发射。

* 4.整个过程就是“装载”、“发射”、“装载”、“发射”、“装载”、“发射”

*@authoryw-tony

**/

public classClipTest {public static voidmain(String[] args){final BoreManager manager = newBoreManager();//开启3个线程装弹

for(int i=0;i<3;i++){new Thread(newRunnable(){

@Overridepublic voidrun() {while(true){

manager.loading();

}

}

}).start();

}//开启两个线程进行发射

for(int i=0;i<2;i++){new Thread(newRunnable(){

@Overridepublic voidrun() {while(true){

manager.send();

}

}

}).start();

}

}/*** 模拟装弹以及发射的管理类

*@authoryw-tony

**/

static classBoreManager{int boreCount = 1;boolean flag = false;//线程开启标记//队列中对多存储12个子弹

ArrayBlockingQueue blocking = new ArrayBlockingQueue(12);//List blocking = new ArrayList();

Lock lock = newReentrantLock();

Condition cond1=lock.newCondition();

Condition cond2=lock.newCondition();/*** 发射*/

public voidsend(){

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 voidloading(){

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

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

    同样是从网上看到的一个需求,需求描述都在代码中. 不多说了,直接贴代码了.相信大家都能够看得懂的! package cn.yw.bore;import java.util.ArrayList; imp ...

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

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

  3. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  4. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  5. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  6. Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信

    为什么80%的码农都做不了架构师?>>>    Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...

  7. 线程并发库和线程池的作用_并发–顺序线程和原始线程

    线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...

  8. java 锁_Java之线程并发的各种锁、锁、锁

    因为两周没更新了... 也不是懒,这两周确实有些忙,赶项目进度赶的不亦乐乎... 终于赶在工期前,可以进入内测了,我也有了些时间,可以更新啦... 线程并发锁是很常见的问题,而且在Java中锁的类型. ...

  9. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  10. java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔

    ***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...

最新文章

  1. Linux Shell脚本编程--cut命令
  2. Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp
  3. 那些年困扰我们的Linux 的蠕虫、病毒和木马
  4. MSDN WebCast网站全新改版
  5. 壁纸图片|2020年12月游戏图片大全
  6. 独家对话华为王成录:手机 HarmonyOS 开发者 Beta 版将如约而至
  7. 【C语言】之冒泡排序法(详解)
  8. 射影几何----二次曲线三角形调和定理的应用,圆锥曲线内接焦点三角形定理的证明【原创】
  9. 正则判断数字加下划线加数字
  10. php设为首页代码,JavaScript
  11. 产出投入表结构类型的介绍
  12. MYS-6ULX-IOT 开发板测评——支持 RTL8188 WiFi 模块
  13. java计算机毕业设计高校防疫物资管理系统MyBatis+系统+LW文档+源码+调试部署
  14. 工作态度-《精要主义》书中的精髓:我们如何践行精要主义,摆脱拥挤不堪的生活?
  15. csv文件——简单读操作01
  16. xuelipay 个人即时到账收款平台 原理及源码详解 支持支付宝微信
  17. 10年+工作经验总结:测试工程师职业成长路线图
  18. 爬虫urllib。request中各种处理器,构造opener。open(处理登陆验证的,处理cookies的,处理代理设置的)
  19. 算法——树(10%)
  20. 蓝牙核心技术介绍(蓝牙协议、架构、硬件和软件笔记)

热门文章

  1. 【转】boost 内存池
  2. 不同数据量下主键类型的选择
  3. 解决jQuery多个版本,与其他js库冲突方法
  4. Zookeeper 常用Shell命令总结
  5. Spring Cloud Alibaba @SentinelResource配置详解
  6. 这位BAT大佬写的Leetcode刷题笔记,让我offer拿到手软
  7. mpvue学习笔记-之微信数据请求封装
  8. 用 Vue 做一个简单的购物app
  9. 海外并购频频被阻 中国芯发展之路困难重重
  10. 基础数据结构-线性表-顺序表的连续操作