java多线程同步:生产者与消费者问题
生产者与消费者问题问题是线程同步里边一个很经典的问题。
用通俗的语言来描述:一群生产者不断的生产产品,并将产品放到一个容器里边;同时一群消费者不断从容器里边消费产品。
容器的容量是有限的。如果容器满了,生产者不能再往容器放产品,必须进入等待状态。等待产品被消费者拿走了,再往容器放产品。
同样,如果容器空了,消费者也必须进入等待状态。等待生产者往里边放产品,再将消费者唤醒。
下边我们来看看如何用java代码来实现
我们假设生产者是一群厨师,产品是面包,容器是一个篮子,消费者是一群消费者。
用面向对象的思维来考虑,我们要至少要定义4个类
先定义好面包类
生成前篮子里有面包:0 个第1个厨师生成的面包消费前篮子里有面包:1 个第2个顾客消费了 -->第1个厨师生成的面包消费前篮子里有面包:0 个篮子空了,我开始等等。。。。。。生成前篮子里有面包:0 个第2个厨师生成的面包第1个顾客消费了 -->第2个厨师生成的面包生成前篮子里有面包:0 个第2个厨师生成的面包生成前篮子里有面包:1 个第1个厨师生成的面包生成前篮子里有面包:2 个第2个厨师生成的面包生成前篮子里有面包:3 个第1个厨师生成的面包生成前篮子里有面包:4 个第2个厨师生成的面包生成前篮子里有面包:5 个第1个厨师生成的面包生成前篮子里有面包:6 个第2个厨师生成的面包生成前篮子里有面包:7 个第1个厨师生成的面包生成前篮子里有面包:8 个第2个厨师生成的面包生成前篮子里有面包:9 个第1个厨师生成的面包生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第2个顾客消费了 -->第1个厨师生成的面包第2个厨师生成的面包篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第1个顾客消费了 -->第2个厨师生成的面包第1个厨师生成的面包生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第2个顾客消费了 -->第1个厨师生成的面包第2个厨师生成的面包篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第1个顾客消费了 -->第2个厨师生成的面包第1个厨师生成的面包生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第1个顾客消费了 -->第1个厨师生成的面包第2个厨师生成的面包篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第2个顾客消费了 -->第2个厨师生成的面包第1个厨师生成的面包生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。生成前篮子里有面包:10 个篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第1个顾客消费了 -->第1个厨师生成的面包第2个厨师生成的面包篮子满了,我开始等等。。。。。。消费前篮子里有面包:10 个第2个顾客消费了 -->第2个厨师生成的面包第1个厨师生成的面包消费前篮子里有面包:10 个第1个顾客消费了 -->第1个厨师生成的面包消费前篮子里有面包:9 个第2个顾客消费了 -->第2个厨师生成的面包消费前篮子里有面包:8 个第1个顾客消费了 -->第1个厨师生成的面包消费前篮子里有面包:7 个第2个顾客消费了 -->第2个厨师生成的面包消费前篮子里有面包:6 个第1个顾客消费了 -->第1个厨师生成的面包消费前篮子里有面包:5 个第2个顾客消费了 -->第2个厨师生成的面包消费前篮子里有面包:4 个第1个顾客消费了 -->第1个厨师生成的面包消费前篮子里有面包:3 个第2个顾客消费了 -->第2个厨师生成的面包消费前篮子里有面包:2 个第1个顾客消费了 -->第1个厨师生成的面包消费前篮子里有面包:1 个第2个顾客消费了 -->第2个厨师生成的面包