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

mac2025-04-17  2

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)