多线程的应用之生产者/消费者例题

本文通过一个实例详细介绍了如何使用Java实现生产者/消费者模式。店员能持有20个产品,生产者在库存满时停止生产,空缺时继续,消费者在无产品时等待,有产品时取走。涉及多线程、数据共享和线程间通信,通过Clerk、Productor和Customer类实现。
摘要由CSDN通过智能技术生成

多线程的应用之生产者/消费者例题

需求

  • 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员那里取出产品
  • 店员一次只能持有固定数量的产品(20),如果生产者试图生产更多的产品,店员会叫生产者停产
  • 如果店中有空位放产品了,再通知生产者继续生产,如果店中没有产品了,会叫消费者等一下。
  • 如果店中有产品了,会叫消费者过来取。

分析

  • 1、涉及到多线程问题:消费者、生产者
  • 2、涉及到数据共享问题,即线程安全问题
  • 3、共享数据是生产的数量
  • 4、涉及到线程之间的通信–>生产者与消费者之间的通信。
  1. Clerk(职员类) 里面定义了产品的数量, 以及生产者对于共享数据和消费者的方法。
class Clerk{

  int production;

  //涉及到线程安全,加锁
  public synchronized void addProduct() {

      if(production >= 20) {
          try {
              wait();
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }else{
          production ++;
          System.out.println(Thread.currentThread().getName()+"生产产品,生产的为第" + production +"个");
          notifyAll();
      }
  }
  public synchronized void customerProduct() {
      //当小于0时,就让消费者等待
      if(production <= 0) {
          try {
              wait();
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }else {
          System.out.println(Thread.currentThread().getName()+"消费了的为第" + production +"个");
          production --;
          notifyAll();
      }
  }
}
  1. Productor(生产者类) ,里面的构造器中实例化了Clerk类,调用了店员的增加产品的方法。
class Productor implements Runnable{

   //利用构造器来实例化Clerk
   Clerk clerk;

   public Productor (Clerk clerk) {
       this.clerk = clerk;
   }

   @Override
   public void run() {
       System.out.println("生产者开始生产产品");
       while(true) {
           try {
               Thread.currentThread().sleep(100);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           clerk.addProduct();
       }
   }
}
  1. Customer(生产者类) ,里面的构造器中实例化了Clerk类,以及调用了店员对于消费者消费产品的方法。
class Customer implements Runnable {

   Clerk clerk;

   public Customer (Clerk clerk) {
       this.clerk = clerk;
   }
   @Override
   public void run() {
       System.out.println("消费者消费产品");
       while (true) {
           try {
               Thread.currentThread().sleep(100);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           clerk.customerProduct();
       }
   }
}
  1. 测试
 public static void main(String[] args) {
       Clerk clerk = new Clerk();
       Productor productor = new Productor(clerk);
       Customer customer = new Customer(clerk);
       //创建线程
       Thread t1 = new Thread(productor);
       Thread t2 = new Thread(customer);

       //给线程取名字
       t1.setName("生产者");
       t2.setName("消费者");

       t1.start();
       t2.start();
   }

每次积累都是对提高自己的表现,加油,我还没追上你呢!哈哈!即使追上你了,我也不会停止我奋斗的步伐,因为我会让你过上好日子的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个在努力为老板实现梦想的搬砖工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值