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(); } } }