package com.kaibing.design; public class ProductorAndCustomer { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor productor = new Productor(clerk); Customer customer = new Customer(clerk); new Thread(productor, "生产者A:").start(); new Thread(customer, "消费者A:").start(); new Thread(productor, "生产者B:").start(); new Thread(customer, "消费者B:").start(); } static class Clerk {//店员类 private int product = 0; public synchronized void get() {//进货 while (product >= 1) {//容量为1 System.out.println("库存已满"); try { this.wait();//等待:为了避免虚假唤醒,wait在循环中使用 } catch (InterruptedException e) { e.printStackTrace(); } } //进货 System.out.println("库存" + ++product); this.notifyAll();//唤醒 } public synchronized void sale() {//卖货 while (product <= 0) { System.out.println("库存已空"); try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("卖货" + --product); this.notifyAll();//唤醒 } } static class Productor implements Runnable { private Clerk clerk; public Productor(Clerk clerk) { this.clerk = clerk; } @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } clerk.get();//消费货物 } } } static class Customer implements Runnable { private Clerk clerk; public Customer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { for (int i = 0; i < 10; i++) { clerk.sale();//消费货物 } } } }