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();//消费货物
}
}
}
}