生产者和消费者之间不直接通讯,而通过阻塞队列来进行通讯, 所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列, 消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一 个缓冲区,平衡了生产者和消费者的处理能力。
生产者消费者模型:
五个消费者:
一个生产者:
使用wait+notify实现阻塞队列:
自定义的阻塞队列中, put() 方法用于向队列中添加元素。notifyAll唤醒所有当前正在 this 锁等待的线程。
自定义的阻塞队列中, take() 方法用于获取队列中的队首元素,在每次获取时,需要判断该队列 是否为空,如果为空,则需要调用 wait() 方法让当前线程处于等待状态并释放 this 锁。被 put() 方法通过 notifyAll() 唤醒返回时,需要重新获得 this 锁。然后继续判断队列是否为空。当队列不为空,将队首元素返回。
使用Condition实现阻塞队列:
在使用 synchronized 时,可以通过 wait() 和 notify() 实现线程等待和唤醒。使用 ReentrantLock 可以通过 Condition 实现线程的等待和唤醒。
使用 Condition 时,引用的 Condition 对象必须从 Lock 实例的 newCondition() 返回,这样才能获得一个绑定 了 Lock 实例的 Condition 实例。
wait() 会释放当前锁,进入等待状态;
signal() 会唤醒某个等待线程;
signalAll() 会唤醒所有等待线程;
唤醒线程从 await() 返回后需要重新获得锁。