class Clerk {
private int products;
private int maximum; // 最大储货量
public Clerk(int maxmum) {
this.maximum = maxmum;
}
public synchronized void addProduct() {
if (products >= maximum) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
products++;
System.out.println(Thread.currentThread().getName() + "到货第 " + products + "个产品");
notifyAll();
}
}
public synchronized void saleProduct() {
if (products > 0) {
System.out.println(Thread.currentThread().getName() + "买走第 " + products + "个产品");
products--;
notifyAll();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Producer implements Runnable{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
while (true) {
clerk.addProduct();
try {
Thread.currentThread().sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
while (true) {
clerk.saleProduct();
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* Created by bruce on 2018/7/22.
*/
public class ProducerAndConsumer {
public static void main(String[] args) {
Clerk clerk = new Clerk(20);
Thread t1 = new Thread(new Producer(clerk));
Thread t2 = new Thread(new Consumer(clerk));
Thread t3 = new Thread(new Consumer(clerk));
Thread t4 = new Thread(new Consumer(clerk));
t1.setName("生产者");
t2.setName("消费者1");
t3.setName("消费者2");
t4.setName("消费者3");
t1.start();
t2.start();
t3.start();
t4.start();
}
}