博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java使用线程并发库模拟弹夹装弹以及发射子弹的过程
阅读量:6706 次
发布时间:2019-06-25

本文共 3185 字,大约阅读时间需要 10 分钟。

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

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

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
blocking = new ArrayBlockingQueue
(12);// List
blocking = new ArrayList
(); 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(); } } }}

 

转载于:https://www.cnblogs.com/tony-yang-flutter/p/3507398.html

你可能感兴趣的文章
linux运维面试题
查看>>
Objective-C之成魔之路【17-内存管理】
查看>>
c++学习总结:抽象类
查看>>
Quartz2.x增、删、改工具类
查看>>
第十章 Scala 容器基础(十五):使用flatten方法来展开一个元素为集合的集合
查看>>
几个网络名词
查看>>
各文件系统对单个文件大小的限制
查看>>
vi 详解
查看>>
oKit项目管理软件之管理第一个项目
查看>>
....
查看>>
两个反汇编引擎
查看>>
在 Firefox 上如何配置 Emacs Org 模式
查看>>
iphone开发-Local Notifications
查看>>
ubuntu(4)
查看>>
curl应用总结
查看>>
META-INF
查看>>
java去除List中重复的元素
查看>>
(一)cookie和seesion的工作原理
查看>>
终于可以在html上自动显示汉字拼音了
查看>>
sd 控制器的分析
查看>>