import java.util.Random;
import java.util.concurrent.*;
class Buffer{
final int SIZE=5;
int buffer[]=new int [SIZE];
int in=-1,out=-1;
}
class Producer extends Thread{
Semaphore mutex,empty,full;
Buffer buffer;
public Producer(Semaphore m,Semaphore e,Semaphore f, Buffer buf){
mutex=m;empty=e;full=f;
buffer=buf;
}
public void run(){
Random r=new Random();
for(int i=0;i<10;i++){
try{
empty.acquire();
mutex.acquire();
buffer.in=(buffer.in+1)%buffer.SIZE;
buffer.buffer[buffer.in]=r.nextInt()%10000;
System.out.println(this.getId()+" produce a item:"+buffer.buffer[buffer.in]);
mutex.release();
full.release();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{
Semaphore mutex,empty,full;
Buffer buffer;
public Consumer(Semaphore m,Semaphore e,Semaphore f, Buffer buf){
mutex=m;empty=e;full=f;
buffer=buf;
}
public void run(){
for(int i=0;i<10;i++){
try{
full.acquire();
mutex.acquire();
buffer.out=(buffer.out+1)%buffer.SIZE;
int value=buffer.buffer[buffer.out];
System.out.println(this.getId()+ " get a item:"+value);
buffer.buffer[buffer.out]=-1;
mutex.release();
empty.release();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public class ProducerAndComsuer {
public static void main(String args[]){
Buffer buf =new Buffer();
Semaphore mutex=new Semaphore(1);
Semaphore empty=new Semaphore(buf.SIZE);
Semaphore full=new Semaphore(0);
//一个生产者,一个消费者
/* Producer p=new Producer(mutex,empty,full,buf);
Consumer c=new Consumer(mutex,empty,full,buf);
p.start();c.start();*/
//多个生产者和消费者
Producer ps[]=new Producer[10];
Consumer cs[]=new Consumer[10];
for(int i=0;i<3;i++){
ps[i]=new Producer(mutex,empty,full,buf);
cs[i]=new Consumer(mutex,empty,full,buf);
ps[i].start();
cs[i].start();
}
}
}