
/*
  线程通信的应用:经典例题:生产者/消费者问题
 
  分析:
  1.是否是多线程问题?是,生产者线程,消费者线程
  2.是否有共享数据?是,店员(或产品)
  3.如何解决线程的安全问题?同步机制,有三种方法
  4.是否涉及线程的通信?是
 
 
 *
package com.atguigu.exercise1;/*** 线程通信的应用:经典例题:生产者/消费者问题** 分析:* 1.是否是多线程问题?是,生产者线程,消费者线程* 2.是否有共享数据?是,店员(或产品)* 3.如何解决线程的安全问题?同步机制,有三种方法* 4.是否涉及线程的通信?是**** @author Dxkstart* @create 2021-05-07 21:33*/public class ProductTest {public static void main(String[] args) {Clerk clerk = new Clerk();Produce p1 = new Produce(clerk);p1.setName("生产者1");Consumer c1 = new Consumer(clerk);c1.setName("消费者1");p1.start();c1.start();}}class Clerk{//共享的private int productCount = 0;//生产产品public synchronized void produceProduct() {if(productCount < 20){productCount ++;System.out.println(Thread.currentThread().getName() +": 开始生产第"+ productCount+"个产品");notify();}else{//等待try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}//消费产品public synchronized void consumeProduct() {if(productCount > 0){System.out.println(Thread.currentThread().getName()+": 开始消费第"+ productCount + "个产品");productCount --;notify();}else{//等待try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}class Produce extends Thread{//生产者private Clerk clerk;public Produce(Clerk clerk) {this.clerk = clerk;}@Overridepublic void run() {System.out.println(getName() + ": 开始生产产品.....");while(true){try {sleep(50);} catch (InterruptedException e) {e.printStackTrace();}clerk.produceProduct();}}}class Consumer extends Thread{//消费者private Clerk clerk;public Consumer(Clerk clerk) {this.clerk = clerk;}@Overridepublic void run() {System.out.println(getName() + ":开始消费产品.....");while(true){try {sleep(50);} catch (InterruptedException e) {e.printStackTrace();}clerk.consumeProduct();}}}
