多线程编程之生产者消费者(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();
  }
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值