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