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实现生产者与消费者,虽然可行,也没有错误,但是最终唤醒全部线程的做法会牺牲程序的性...