/*

  • 生产者消费者模型, 也就是, 说在这里用java来直接模拟生产者与消费者, 生产一个取出一个, 取出一个再生产一个

  • 用Mes对象, 来存储生产和取出的消息, 用生产者和消费者两个线程来表示生产和取出的过程, 用synchronized来保证数据的同步

  • */
    class Mes{
    private String name; //信息组成内容, 姓名
    private String des; //信息组成内容, 描述

    private boolean flag = true; //用于表示目前所处状态, 如果, flag为true, 则表示可以生产, 而不可以消费, 反过来则, 生产线程等待, 消费线程可以执行
    public synchronized void set(String name, String des) //生产消息的代码
    {

      if(!flag)        //如果不能生产则挂掉, 也就是让县城等待
      {
          try {
    
              super.wait();
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          ;
      }
    
      try {
          Thread.sleep(10);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
    //如果可以生产:
    this.name = name;
    this.des = des;

    //这个时候, 改变目前所处的状态:

    flag = false;
    //唤醒消费线程:

    super.notify();
}

public synchronized String get()        //取出消息的代码
{
    if(flag)            //如果处于不能取出的状态, 则:
    {
        try {

            super.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    //将数据取出之后, 记得唤醒生产线程

    try{

        return this.name + "-" + this.des;
    }finally {
        super.notify();
        flag = true;       //改变线程目前所处的状态


    }
}

}

class coms implements Runnable{ //消费者类

private Mes mes;
public coms(Mes mes)
{
    this.mes = mes;
}

@Override
public void run() {

    for(int x =0; x< 50; x++)
    {
        System.out.println(this.mes.get());
    }

}

}

class producer implements Runnable{ //生产者类

private Mes mes;
public producer(Mes mes)
{
    this.mes = mes;
}

@Override
public void run() {
    for(int x=0; x<50; x++)
    {

        if(x%2 == 0)
        {
            mes.set("Winni", "真是一个漂亮的小姑娘");
        }
        else
        {
            mes.set("小花小花", "blingblingbling");
        }
    }
}

}

public class ProducerAndConsumer {
public static void main(String [] args)
{
System.out.println("咋回事儿");
Mes mes = new Mes();
// con c = new con(mes);
coms cc = new coms(mes);
producer p = new producer(mes);

    new Thread(p).start();
    new Thread(cc).start();

}

}