简单介绍一下生产消费者模型,如下图:
一般来说,生产消费者模型就是消费者和生产者可以共同操作茶叶仓库这一个共享资源 。打一个比方,生产者生产茶叶供向茶叶市场,消费者在茶叶市场购买茶叶,其中茶叶市场上的茶叶量就是一个共享资源。生产者生产了茶叶就可以让消费者来消费,并且消费者发现茶叶市场没茶了就让生产生产,这是共享资源的一种方式。
在多线程的情况下 ,对共有资源的操作安全性就显得尤为重要,首先我们要对消费者、生产者和仓库进行上锁处理。
消费者:
先拿到仓库的锁,进入仓库,查看仓库中是否有货,有,可进行购买,然后释放仓库锁;如果没有货,通知生产者生产货物,释放仓库锁。
生产者:
进入仓库查看仓库库存是否已满;已满,通知消费者消费,自己进入等待状态,释放仓库锁,未满,生产产品并唤醒消费者,然后释放锁。
仓库:
具有仓库容量的属性,因为是共有资源,还需要加锁,避免出现线程安全问题。
另外为了实现该模型还需用到线程的两个状态:
wait() 会执行该方法的当前的线程进入等待状态 ;
notifyAll() 唤醒所有被wait()的线程
代码如下:
消费者
package com.thread.v