黑马程序员技术交流社区

标题: 生产消费者问题? [打印本页]

作者: ↙五线谱╲    时间: 2013-12-5 20:28
标题: 生产消费者问题?


Thread-2__消费者___名称:洗衣服1782
Thread-0__生产者__名称:洗衣服1783
Thread-3__消费者___名称:洗衣服1783
Thread-1__生产者__名称:洗衣服1784
经常打印出的是先有消费者后有生产者,应该是先有生产者后有消费者的,是什么原因出现先消费后生产的呢?
作者: Jim-剣◆﹏    时间: 2013-12-5 20:35

多线程的安全问题
建议再看多一遍老毕关于生产者消费者的视频,专门讲你这问题
作者: 李文帅    时间: 2013-12-5 21:21
1、在资源类中定义一个boolean类型的标识位flag,初始值为false,表示没有资源
2、在生产者执行的代码中添加循环判断操作,若flag为false,则说明没有资源,可以继续执行,生产操作执行完后将flag改为true,并唤醒消费者,若flag为true,则说明已有资源,等待
3、在消费者执行代码中添加循环判断操作,若flag为false,则说明没有资源,等待,若为true,则说明已有资源,可以继续执行,消费操作执行后将flag改为true,并唤醒生产者
这样就可以保证先让生产者执行操作,再让消费者执行操作
作者: air    时间: 2013-12-6 03:42
你这问题太粗心了,视频里讲的synchronized 就是对付你这个问题的。多看几遍视频吧,
加了锁后
标记为真,让生产者进去。因为标记为真,消费者等待
生产者出来,标记为假。因为标记为假,消费者进入
消费者取出,标记为真,因为标记为真,生产者进入
。。。。。。用while循环实现,你能用代码把我的中文替换就过关了。
因为当时一看视频我就想到厕所,结果毕老师还真举例厕所,我记忆很深。

视频里的关键字: 双重判断解决,synchronized效率低的问题。
代码视频里就有,相信你也练习了才会有疑惑,我就不贴了。
这是一个关于思路的问题,不在代码
作者: ┾——黑马    时间: 2013-12-6 09:02
加个标记
标记为真,让生产者进去。因为标记为真,消费者等待。
生产者出来,标记为假。因为标记为假,消费者进入。
消费者取出,标记为真,因为标记为真,生产者进入。

还有注意:
if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
while判断标记,解决了线程获取执行权后,是否要运行!

notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。
notifyAll解决了本方线程一定会唤醒对方线程的问题。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2