今天开始调试同事实现的三种生产者与消费者模型,三个实现是逐步优化而来的。三个实现代码全部调试完毕后会发步在github上。项目代码:https://github.com/zxc1210449483/producer_consumer。
废话不多说,开始调试:
断点打在main方法里面,进入main方法:
首先新建一个存储产品的pList,类似于一个产品仓库,接着传入pList初始化生产者消费者实例,然后开启生产者线程,进入run方法:
首先获取产品仓库product_list的锁,Synchronized同步锁保证一次只能有一个线程对仓库的产品数量进行修改,保证线程操作的安全性。接着判断仓库是否已满,满了的话就在product_list上调用wait()方法,让当前线程释放product_list的锁,等待被唤醒。为什么是product_list调用wait方法呢?因为当前线程之前已拥有该product_list的锁,wait()不仅仅是暂停当前线程,不让其继续生产产品,还能够让当前线程释放product_list的锁,以便消费者线程能够获取product_list的锁来对product_list里的产品进行消耗,一举两得。那如果仓库未满,就要进行产品的生产,并将产品放入仓库product_list,之后调用product_list.notifyAll()方法,及时通知可能处于wait状态的消费者消费产品。随后的当前线程休眠0.5s是为了模拟生产产品过程中的耗时,同时也是为了避免程序执行过快。
看完生产者的run方法,继续看看消费者的run方法:
消费者在消费之前也要获取product_list的锁以便能从仓库中取出产品,获得锁后先判断仓库中有没有产品,没有就需要让当前消费者线程等待,让出product_list的锁给其他生产者生产商品,如果仓库有产品就从中取出产品,然后唤醒其他可能处于wait状态的生产者线程,让其进行生产。随后线程休眠0.5s,模拟消费活动。
这种生产者与消费者模型的实现使用了同步机制,保证了线程安全,但Synchronized为阻塞型同步机制,即同一时间只能有一个线程在工作。所以生产者生产产品时,消费者不能消费,消费者消费时,生产者也不能进行生产,完全没有发挥多线程的并行优势提升运行效率,这并不是一个很好的实现,需要进行优化,今天先暂停,明天来看看它的优化方案。