生产者消费者模式

生产者消费者模式

初学者、小白通用
傻瓜式使用

好多人的代码对初学者不友好,我重写了一个。Ctrl+C,Ctrl+V直接使用。

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class Test {
    public static void main(String[] args) {
        int i=0;//统计生产总数  只有一个生产者不用考虑线程安全
        ProductHouse productHouse=new ProductHouse();//仓库
        Proudcters proudcters=new Proudcters(productHouse,i);//生产者
        Customer   customer=new Customer(productHouse);//顾客1
        Customer   customer2=new Customer(productHouse);//顾客2
        proudcters.start();//生产者启动
        customer.start();//顾客1
        customer2.start();//顾客2
    }

}
class  Product//产品
{
    private int id;//给产品一个唯一ID,方便观察记录
    public   Product(int id)
    {
        this.id=id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}
class ProductHouse
{
    private  Vector<Product> list=new Vector<Product>();//用线程安全的数组作为仓库存放产品
    private   int lenthen;
    final  private   int max=100;//数组的最大长度
    public void ProductHouse()
    {

    }
    public int getLenthen() {
        return lenthen=list.size();
    }
    public synchronized void push(Product product)//将产品放入仓库的方法,线程安全
    {
        System.out.println("存放");
        while (list.size()>=max)//当数组长度达到最大时等待
        {
          System.out.println("生产等待"+list.size());
          try {
                    this.wait();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("异常");
          }
        }
        list.add(product);//在仓库里添加产品
        this.notifyAll();//当仓库里添加产品时,叫一下正在等待消费者,让他们来消费。

    }
    public  synchronized  Product Pop()//将产品消费(取出)的方法
   {
    Product product;
    while (list.size()==0)//当仓库里没产品的时候等待
    {
      try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }
    if (list.size()<20)//当仓库里的产品教少的时候叫一下生产者
    {
        this.notifyAll();
    }
    System.out.println("仓库里有"+list.size()+"个产品");
    product=list.get(list.size()-1);
    list.remove(list.size()-1);
    return product;
    }
}
class Proudcters extends Thread//生产者对象
{
    private ProductHouse  productHouse;  //生产者要有一个能放产品的ID
    private int i;//生产者要有一个能给产品分发ID 的ID
    public  Proudcters(ProductHouse productHouse,int i)
    {
        this.productHouse=productHouse;
        this.i=i;
    }
    @Override
    public void  run()
    {
            while(true) {
                Product product = new Product(i);//生产产品
                System.out.println("生产的产品ID为" + i);
                productHouse.push(product);//把产品放入仓库
                i++;
            }

    }
}
class  Customer extends  Thread
{
    private ProductHouse productHouse;
    private Product product;
    public  Customer(ProductHouse productHouse)
    {
        this.productHouse=productHouse;
    }
    @Override
    public void  run()
    {
            while (true) {
                product=productHouse.Pop();
                System.out.println("消费的产品ID为:"+product.getId());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值