黑马程序员技术交流社区
标题:
生产者与消费者的特殊问题
[打印本页]
作者:
刘俊佳
时间:
2012-8-16 09:33
标题:
生产者与消费者的特殊问题
以下是毕老师视频里面讲到的生产者与消费者程序里面类Resource的代码:
package thread2;
public class Resource {
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void set(String name) {
while(flag)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.name = name + "--" + count++;
System.out.println(Thread.currentThread().getName() + "...生产者..."
+ this.name);
flag=true;
this.notifyAll();
}
public synchronized void out() {
while(!flag)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "...消费者..."
+ this.name);
flag=false;
this.notifyAll();
}
}
复制代码
这段代码里面中循环判断标记这一块我有疑问,毕老师视频里是说:
假设当t1获得CPU执行权的时候,t1判断标记为假,它不需要等待,它就往里面赋了一个值,然后count++一次,再打印
如果它赋的值是130,那么假设它打印的是Thread-0...生产者...+商品+--130(当然,有可能也会是Thread-1...生产者...+商品+--130),
即表示生产了一次,生产完以后,就把标记置为真了,然后执行notify,notify完以后,它这时是还有执行权的,
然后去再次判断,一看flag为true,它于是就等着,这时t2,t3,t4都有可能抢到CPU执行权,假设t2抢到了,它于是去判断标记,
一看为真,于是它也就等着了,这时只剩下t3和t4了,t3一进来判断标记!flag为假,不需要等,即消费了一次,到目前为止,这属于正常消费,
即生产一次,消费一次,消费完了以后,它就把标记置为false了。
这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?
作者:
pphdsny3
时间:
2012-8-16 10:03
我感觉没什么问题呀
1,假设t1拿到执行权,此时flag=false的时候,判断标记为假,于是乎t1就去生产了,t2,t3,t4由于又锁所以在外面等着
2,t1执行完了以后,将flag置为true,并唤醒所有的线程去抢执行权
3,t2抢到了因为flag为true所以继续等
4,t3或则t4抢到了执行权后,消费一次,将flag置为false,并唤醒其他线程
5,就算t4抢到了执行权,但是!flag为真,所以它也只能等着,所以只剩下t1,t2去生产了
这不是很正常的生产一次,消费一次么?
至于你说的:"这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?"
t3抢到执行权以后,它的钱会先去判断标志,标志flag为true代表有货,为false代表没货,那如果!flag为真的话,则此时仓库的确是没货的,t3只能等待了,等t1,t2去生产了,它才能消费
你的上面理解都是正确,你最后的疑问感觉是你自己误导了自己,可以再去想想,是没有问题的!
作者:
官文昌
时间:
2012-8-16 10:05
这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?--------------------------------------------
这里毕老师是把仓库有货设为true(flage为真),没货设为false(flage为假),按你说的(t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊)!flage为真,那是不是flage为假啊,既然flage为假,是不是代表仓库里面没货啊?没货消费者怎样消费啊.......
作者:
左建飞
时间:
2012-8-16 10:23
毕老师的意思是t3(!flag)为假,这时flag为真。flag才是判断仓库有没有货的依据。
作者:
刘俊佳
时间:
2012-8-29 08:43
谢谢楼上的各位解答,问题已经解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2