黑马程序员技术交流社区
标题:
关于多线程wait()和notify()方法的疑问
[打印本页]
作者:
黑马刘向阳
时间:
2012-11-4 22:07
标题:
关于多线程wait()和notify()方法的疑问
本帖最后由 刘晓阳 于 2012-11-7 19:32 编辑
今天看马士兵的视频到多线程这一章,感觉没听懂,不知道是不是他讲错了
一个生产者消费者的例子,马老师说这个进程wait()之后,就要notify()其他进程,意思不就是wait()后面的语句还在执行了?
代码中的注释是我的理解,不知道对不对?
视频具体在马士兵的多线程中的生产者消费者问题第27分钟左右
public synchronized void push(WoTou wt) {
while(index == arrWT.length) {
try {
this.wait(); //如果现在一个生产者一个消费者,如果arrWT满了,这个生产者wait(),
//那wait()后面的语句是不是就不执行了?然后那边消费者使index--后,
//在下一次才notify()生产者进程?对于这个代码,是不是这样?
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify(); //这个notify()是在生产者没有wait()下每次都执行的,
//也就是每次生产过程都会notify()其他进程,不管
//其他进程有没有wait()?
arrWT[index] = wt;
index ++;
}
public synchronized WoTou pop() {
while(index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return arrWT[index];
}
}
复制代码
作者:
杨雪松
时间:
2012-11-4 22:57
本帖最后由 杨雪松 于 2012-11-4 23:04 编辑
当一个线程生产者t1在你的push函数读锁以后开始判断while语句,为真的话就wait在那里了,不能继续往下执行了,t1就在等待别人来唤醒他;
而另一进程消费者t2去了pop函数,读锁以后判断为假,她就继续往下执行,执行到this.notify();的时候,就唤醒了t1;
因为这时index=0,接着t2再进pop时就wait了,而t1活了以后接着走push,判断为假,执行代码,又唤醒了t2;
总之他俩就是在交替进行,互相唤醒的.不知道我这样说行不行.
你上边说的"马老师说这个进程wait()之后,就要notify()其他进程"这是不对的,他都睡着了怎么唤醒其他人呢...
不过我并没有看过马老师的视频,可能是听错了吧.也可能是老师口误不要太纠结
{:soso__8239267033281376257_3:}
作者:
黑马刘向阳
时间:
2012-11-5 12:29
杨雪松 发表于 2012-11-4 22:57
当一个线程生产者t1在你的push函数读锁以后开始判断while语句,为真的话就wait在那里了,不能继续往下执行了, ...
谢谢 明白了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2