生产者一边在生产,消费者一边消耗。当库存满的时候生产者暂停生产,直到有空位;当库存空的时候消费者暂停消费,直到有产品。
关键点:
生产者和消费者都是在不断生产和消费的,是同时并发的,不应该等满了再消费 / 空了再生产。
前提条件是生产速度和消费速度不同。
设计方法:
生产者和消费者分别使用一个线程模拟。将其抽象分别继承Runnable接口,生产和消费的行为放在Runnable的run()方法中.
控制生产和消费的速度不同。可以使每次生产 / 每次消费 之间的间隔不同,达到 生产比消费快 或者 消费比生产快 的效果.
生产者拿到仓库锁,判断是否还有空位
如果没有空位,就让自己先别再去试图抢占锁了(将自己放入等待池,wait());
如果有空位,就生产一个,然后唤醒(notify())等待池中的线程(包括先前因为仓库空而wait()掉的线程)来竞争锁。
消费者拿到仓库锁,判断是否还有可以消费的商品
如果没有商品了,就让自己先别再去试图抢占锁了(将自己放入等待池,wait());
如果有空位,就消费一个,然后唤醒(notify())等待池中的线程(包括先前因为仓库满而wait()掉的线程)来竞争锁。
当某个生产者线程拿到锁,发现仓库满了,会wait()自己,而不notify()(防止又唤醒一个生产者线程),直到有一个消费者线程拿到锁,消费后,才notify()等待池中的生产者线程,才继续生产。(消费者同理)
1.使用synchronized 关键字
public class ProducerCustomerModel {
static int MAX_SIZE = 10;
static List list;
public static void main(String[] args) {
list = new ArrayList<>();
new Thread(new Producer()).start();
new Thread(new Customer()).start();
}
private static class Producer implements Runnable{
@Override
p