实现有多个缓冲区的生产和消费问题

Demo示例: 模拟实现有多个缓冲区的生产和消费问题。
    分析:多缓冲区时是指在生产者和消费者之间有多个缓冲区,为了方便管理,缓冲区被安排为头尾相接的模式,
    定义操作对象的属性,goods表示缓冲区,为多缓冲区则定义为集合或数组,front为缓冲区的头指针,rear为缓冲区的尾指针,count则为缓冲区存放的个数,nbuf则为缓冲区的大小。
    front = (front+1)%nbuf; //头指针
    rear = (rear+1)%nbuf;//尾指针

    public class CubbyHole{
        private int[] goods;
        private int front;
        private int rear;
        private int count;
        private int nbuf;
        public CubbyHole(int nbuf){
            this.nbuf = nbuf;
            front =0;
            rear =0;
            count=0;
            goods = new int[nbuf];
        }
        //在缓冲区取数据
        public synchronized int get(int id){
            //缓冲区没有数据则阻塞
            while(count<=0){
                try{
                    wait();
                }catch(InterruptedException e){
                    e.pritnStackTrace();
                }
            }
            front = (front+1)%nbuf;
            System.out.println("第"+id +"号消费者拿走了数据"+goods[front]);
            count--;
            notifyAll();
            return goods[front];
        }
        //向缓冲区放数据
        public synchronized void put(int value,int id){
            //缓冲区已经满了
            while(count>=nbuf){
                try{
                    wait();
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                rear = (rear+1)%nbuf;
                goods[rear] = value;
                System.out.println("第"+id +"号消费者拿走了数据"+goods[rear]);
                count++;
                notifyAll();
            }
        }    
    }
    public class Producer extends Thread{
        private CubbyHole cubbyHole;
        private int id;
        public Producer(CubbyHole cubbyHole,int id){
            this.cubbyHole = cubbyHole;
            this.id = id;
        }
        public void run(){
            for(int i=0;i<50;i++){
                cubbyHole.put( (int)(Math.random*100) , id );
            }
        }
    }
    public class Consumer extends Thread{
        private CubbyHole cubbyHole;
        private int id;
        public Consumer(CubbyHole cubbyHole,int id){
            this.cubbyHole = cubbyHole;
            this.id = id;
        }
        public void run(){
            for(int i=0;i<50;i++){
                cubbyHole.get(id);
            }
        }
    }
    public class Index{
        private  static int np =4;
        private static int nc =4;
        public static int nbuf =10;
        public static void main(String [] args){
            CubbyHole cubbyHole = new CubbyHole( nbuf );
            Producer[] producer = new Producer[np];
            for(int i=0;i<producer.length;i++){
                producer[i] = new Producer(cubbyHole,i+1);
                producer.start();
            }
            Consumer [] consumer = new Consumer[nc];
            for(int i=0;i<consumer.length;i++){
                consumer[i] = new Consumer(cubbyHole,i+1);
                consumer[i].start();
            }
            try{
                for(int i=0;i<np;i++){
                    producer[i] .join();
                }
                for(int i=0;i<nc;i++){
                    consumer[i] .join();
                }
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值