public class Storage {
//仓库最大存储量
private int MAX_SIZE;
//仓库存储的载体
private LinkedList<Object> list = new LinkedList<>();
//锁
private final Lock lock = new ReentrantLock();
//“仓库满”的条件变量
private final Condition produceCondition = lock.newCondition();
//“仓库空”的条件变量
private final Condition consumeCondition = lock.newCondition();
public Storage(int maxSize) {
this.MAX_SIZE = maxSize;
}
/**
* 生产num个产品
* @param num
*/
public void produce(int num) {
//获取锁
lock.lock();
//剩余空位置不足
while(list.size() + num >= MAX_SIZE) {
System.out.println("【要生产的产品数量】:" + num + "\t【库存量】:" + list.size()
+ "\t【剩余空间】:" + (MAX_SIZE - list.size()) + "\t暂时不能执行生产任务!");
try {
//没法生产,先阻塞
produceCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//剩余空间足够,生产num个产品
for(int i = 0; i < num; ++i) {
list.addLast(new Object());
}
System.out.println("【本次生产产品数】:" + num + "\t【当前库存为】:" + list.size());
//唤醒所有消费者线程
consumeCondition.signalAll();
//解锁
lock.unlock();
}
/**
* 消费num个产品
* @param num
*/
public void consume(int num) {
//获得锁
lock.lock();
//如果仓库存储量不够num个,本次消费阻塞
while(list.size() < num) {
System.out.println("【要消费的产品数量】:" + num + "\t【库存量】:" + list.size()
+ "\t暂时不能执行消费任务!");
try {
//没法消费,阻塞
consumeCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//库存足够本次消费,消费num个产品
for(int i = 0; i < num; ++i) {
list.removeFirst();
}
System.out.println("【本次消费产品数】:" + num + "\t【当前库存为】:" + list.size());
//消费完了,唤醒所有生产者线程
produceCondition.signalAll();
//释放锁
lock.unlock();
}
}
使用Lock和Condition实现生产者消费者模型
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 之前使用synchronized实现生产者与消费者,虽然可行,也没有错误,但是最终唤醒全部线程的做法会牺牲程序的性...