多线程面试必问生产者消费者案例--------学习总结与思考

一、需求

1、生产者每生产一样东西,消费者立马进行消费,生产与消费交替循环进行。

2、生产者可以生产dove chocolate ,也可以生产哈尔滨啤酒,并且交替循环进行。

3、要求生产的次数达到十次,且消费次数达到十次的时候,程序立马停止。

二、实现

实现1、定义一个生产者和消费者能够共享的布尔型变量flag。生产者中,当访问到变量flag为true,生产者等待;为false时,生产者进行生产,生产结束,flag置为true,然后唤醒等待池的其他其他线程。消费者中,当访问到变量flag为false时,消费者等待;为true时,消费者进行消费,消费结束,flag置为false,然后唤醒等待池的其他其他线程。

实现2、生产者写一个循环,循环变量为奇数生产dove chocolate,为偶数时生产哈尔滨啤酒,每次生产成功,循环变量加1;消费者也写一个循环,每次消费成功循环变量加1。

实现3、生产者消费者中的循环条件从1开始,到10结束,且为了实现先生产再消费,应将flag的初始值设置为false。

三、细节

1、添加同步锁的时候锁的是哪个对象,就要用哪个对象调用线程通信的方法。但这并不妨碍我们锁一个空字符串,锁一个Integer类型的变量,我们只需要空字符串或Integer变量调用线程同步的方法即可。记住:为了保证空字符串/Integer变量是同一个,他们一定不要直接new,声明的话可要可不要。(这儿利用到了字符串和包装类(Float/Double除外)常量池的概念)

2、经过以上的分析,我们可以得出我们只需要三个类即可实现,一个生产者类,一个消费者类,一个测试类。共享的布尔型变量flag在测试类中声明即可。

猜你喜欢

转载自blog.csdn.net/pengzonglu7292/article/details/87597153