/**
* 生产者(Productor)将产品交给店员(Clerk),消费者(Customer)从店员取走产品
* 店员只能持有固定的数目产品(例如:20)
* 如果店员的产品满了,会通知生产者停一下。
* 如果店员的产品没了,会通知消费者等一下。
* 是多线程问题,多个消费者,多个生产者,共享数据是产品和店员
*
/**
* 店员
*/
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 Producer extends Thread{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName()+"开始生产产品...");
while(true){
try {
Thread.sleep(500);
} 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(getName()+"开始消费产品....");
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.consumeProduct();
}
}
}