黑马程序员技术交流社区

标题: 关于多线程wait()和notify()方法的疑问 [打印本页]

作者: 黑马刘向阳    时间: 2012-11-4 22:07
标题: 关于多线程wait()和notify()方法的疑问
本帖最后由 刘晓阳 于 2012-11-7 19:32 编辑

今天看马士兵的视频到多线程这一章,感觉没听懂,不知道是不是他讲错了

一个生产者消费者的例子,马老师说这个进程wait()之后,就要notify()其他进程,意思不就是wait()后面的语句还在执行了?

代码中的注释是我的理解,不知道对不对?

视频具体在马士兵的多线程中的生产者消费者问题第27分钟左右
  1. public synchronized void push(WoTou wt) {
  2.                 while(index == arrWT.length) {
  3.                         try {
  4.                                 this.wait();        //如果现在一个生产者一个消费者,如果arrWT满了,这个生产者wait(),
  5.                                                                                         //那wait()后面的语句是不是就不执行了?然后那边消费者使index--后,
  6.                                                                                         //在下一次才notify()生产者进程?对于这个代码,是不是这样?
  7.                         } catch (InterruptedException e) {
  8.                                 e.printStackTrace();
  9.                         }
  10.                 }
  11.                 this.notify();                //这个notify()是在生产者没有wait()下每次都执行的,
  12.                                                                                         //也就是每次生产过程都会notify()其他进程,不管
  13.                                                                                         //其他进程有没有wait()?
  14.                 arrWT[index] = wt;
  15.                 index ++;
  16.         }
  17.         
  18.         public synchronized WoTou pop() {
  19.                 while(index == 0) {
  20.                         try {
  21.                                 this.wait();
  22.                         } catch (InterruptedException e) {
  23.                                 e.printStackTrace();
  24.                         }
  25.                 }
  26.                 this.notify();
  27.                 index--;
  28.                 return arrWT[index];
  29.         }
  30. }
复制代码

作者: 杨雪松    时间: 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