多線程編程之生產者消費者(java實現)



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

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章