生产者消费者问题

本文通过Java代码实现了一个简单的生产者消费者模式案例。该案例中包含多个生产者线程和消费者线程,它们共享一个仓库对象来模拟生产和消费过程。通过同步方法控制生产与消费的时机,确保仓库不会溢出也不会为空。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


public class Producer_Consumer {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  GoDown gd=new GoDown(20);
  Producer p=new Producer(10,gd);
  Producer p2=new Producer(30,gd);
  Producer p3=new Producer(30,gd);
  Producer p4=new Producer(40,gd);
  Producer p5=new Producer(50,gd);
  Customer c1=new Customer(10,gd);
  Customer c2=new Customer(50,gd);
  Customer c3=new Customer(60,gd);
  Customer c4=new Customer(10,gd);
  Customer c5=new Customer(10,gd);
  p.start();
  p2.start();
  p3.start();
  p4.start();
  p5.start();
  c1.start();
  c2.start();
  c3.start();
  c4.start();
  c5.start();
 }

}

class GoDown{
 public static final int MAX_NUM=100;
 public int curr_num;
 public GoDown(){}
 public GoDown(int num){
  this.curr_num=num;
 }
 
 public synchronized void produce(int n){
  while((this.curr_num+n)>MAX_NUM)
  {
   System.out.println("仓库已经满了,不能再生产了!");
   try {
    wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  curr_num+=n;
  System.out.println("已经生产了"+n+"个产品,库存为"+curr_num+"个产品。");
  notifyAll();
 }
 
 public synchronized void consume(int n){
  while(this.curr_num<n)
  {
   System.out.println("库存产品不够了!");
   try {
    wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  curr_num-=n;
  System.out.println("已经消费了"+n+"个产品,库存为"+curr_num+"个产品。");
  notifyAll();
 }
}

class Customer extends Thread{
 private int num;
 private GoDown godown;
 public Customer(int num, GoDown godown) {
  super();
  this.num = num;
  this.godown = godown;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  godown.consume(num);
 }
 
}

class Producer extends Thread{
 private int num;
 private GoDown godown;
 public Producer(int num, GoDown godown) {
  super();
  this.num = num;
  this.godown = godown;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  godown.produce(num);
 }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值