/**
* 生产者(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(); } } }