zoukankan      html  css  js  c++  java
  • 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();
                }
                
            }
        }
    }
  • 相关阅读:
    Linux下串口编程入门
    arm-linux-gdb+gdbserver环境搭建以及远程调试
    google jib容器打包工具
    docker入门——构建镜像
    Docker搭建MySQL服务
    docker基本操作
    Docker 使用指南—— 基本操作
    使用docker Maven插件本地构建docker镜像并发布到远程服务器
    10张图带你深入理解Docker容器和镜像
    springboot+Jib+Maven+Idea+Docker 实践
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3507398.html
Copyright © 2011-2022 走看看