package DayTest23;

/**线程通信的应用:生产者消费者问题
 * @author 冀帅
 * @date 2020/8/5-20:21
 * 分析:
 *  1.是否是多线程? 是,生产者线程,消费者线程
 *  2.是否有共享数据? 是,店员(或产品)
 *  3.如何解决线程安全问题?同步机制,3种方法
 *  4.是否涉及到线程的通信?是
 */
class  Clerk{
    private  int productCount = 0;
    //生产产品
    public synchronized void produceProduct() {//当前的锁是Clerk的对象clerk
        if (productCount <20){
            productCount++;
            System.out.println(Thread.currentThread().getName()+":开始生产第"+productCount+"个产品" );
            notify();
        }else {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //消费产品
    public synchronized void consumProduct() {
        if (productCount>0){
            System.out.println(Thread.currentThread().getName()+":开始消费第"+productCount+"个产品");
            productCount--;
            notify();
        }else {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}//店员
class  Producer extends  Thread{//生产者
    private  Clerk clerk;
    public Producer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+":开始生产产品....");
        while (true){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.produceProduct();
        }

    }
}
class  Consumer extends  Thread{//消费者
    private  Clerk clerk;
    public Consumer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
            System.out.println(Thread.currentThread().getName()+":开始消费产品....");
            while (true){
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                clerk.consumProduct();
            }

    }
}
public class ProducTest {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
        Producer p1 = new Producer(clerk);
        p1.setName("生产者1");
        Consumer c1 = new Consumer(clerk);
        c1.setName("消费者1");
        Consumer c2 = new Consumer(clerk);
        c2.setName("消费者2");
        p1.start();
        c1.start();
        c2.start();
    }
}

图片说明