这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
生产者消费者模型
- 生产者消费者模型包括生产者,消费者,仓库,产品:
- 生产者在仓库未满时才能生产,仓库满时停止生产
- 消费者在仓库有产品时才能消费,仓库空时等待
- 当消费者发现仓库为空,没有产品可以消费时,通知生产者生产
- 生产者在生产出可以消费的产品时,通知等待的消费者消费
生产者消费者实现
- 生产者消费者示例
- 线程池中可以实现生产者消费者模型
- 这里通过简单的wait() 和notify() 方式实现生产者消费者模型
1 | java复制代码class Depot { |
1 | console复制代码Thread-0 produce( 60) --> want= 0, increment= 60, size= 60 |
- Producer是生产者类,与仓库depot关联. 当调用生产者的produce() 方法时,会新建一个线程并向仓库depot中生产产品
- Consumer是消费者类,与仓库depot关联. 当调用消费者的consume() 方法时,会新建一个线程并消费仓库depot中的商品
- Depot是仓库类,仓库类Depot中记录仓库的容量capacity, 以及仓库中当前产品的数目size :
- 仓库类Depot的生产方法produce() 和消费方法consume() 方法都是synchronized方法,进入synchronized方法体,意味着这个线程获取了该仓库对象的同步锁
- 意味着,同一时间生产者和消费者线程只能有一个能运行. 通过同步锁,实现了对仓库的互斥访问
- produce()生产方法:
- 当仓库满时,生产者线程等待,需要等待消费者消费产品后,生产者线程才能生产
- 生产者线程生产完产品之后,会通过notifyAll() 方法唤醒同步锁上的所有线程,包括消费者线程,这样就可以通知消费者进行消费
- consume()消费方法:
- 当仓库为空时,消费者线程等待,需要等待生产者生产产品之后,消费者线程才能消费
- 消费者线程消费完产品之后,会通过notifyAll() 方法唤醒同步锁上的所有线程,包括生产者线程,这样就可以通知生产者进行生产
本文转载自: 掘金