生产者和消费者

生产者将产品交给店员,而消费者从店员处取走产品,

店员一次只能持有固定的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,

如果店中有空位放产品了再通知生产者继续生产,如果店中没有产品了,店员会告诉消费者等一下。

如果店中有产品了再通知消费者来取走产品。

分析:

1.是否涉及到多线程的问题?是!生产者、消费者

2.是否涉及到共享数据?有!考虑线程的安全

3.此共享数据是谁?即为产品的数量

4.是否涉及到线程的通信呢?存在着生产者与消费者的通信

class Clerk{//店员
  int product;
  public synchronized void addProduct(){//生产产品
     if(product>=20)
        wait();
     else
     {
        product++;
        System.out.println(Thread.currentThread().getName()+
        ":生产了第"+product+"个产品");
        notifyAll();
  }  
  public synchronized void consumeProduct(){//消费产品
     if(product<=0)
	wait();
     else{
	System.out.println(Thread.currentThread().getName()+
        ":消费了第"+product+"个产品");
	product--;
        notifyAll();
     }
  }
}
class Producer implements Runnable{//生产者
  Clerk clerk;
  public Producer(Clerk clerk){
      this clerk=clerk;
  }  
  public viod run(){
    System.out.println("生产者开始生产产品");
    while(true){
       Thread.currentThread().sleep(100);
       clerk.addProduct();
       
    }
  }
}
class Consumer implements Runnable{//消费者
   Clerk clerk;
   public Consumer(Clerk clerk)
   {
      this.clerk = clerk;
   }
   public void run(){
     System.out.println("生产者开始生产产品");
     while(true){
        clerk.consumeProduct();
     }
   }
}
public class TestProduceConsume{
   public static void main(String() args){
       Clerk clerk = new Clerk();
       Producer p1 = new Producer(clerk);
       Producer c1 = new Consumer(clerk);
       Thread t1 = new Thread(p1);//一个生产者的线程
       Thread t2 = new Thread(p2);//一个消费者的线程
       t1.setName("生产者1");
       t2.setName("消费者1");
       t1.start();
       t2.start();
   }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值