public synchronized void push(WoTou wt) {
  while(index == arrWT.length) {
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  this.notifyAll();  
  arrWT[index] = wt;
  index ++;
 }这是一个生产者线程的一部分,我的理解应该是:满了之后就用wait()阻塞,之后用notify()去唤醒消费者线程。但是wait()之后是不是应该就阻塞住了啊?我感觉有点矛盾呢,不知道我哪里理解有误,高手指点一下 多谢! 

解决方案 »

  1.   

    多线程嘛,这个阻塞了还有其他的线程在跑,等到其他的线程notify以后,要是这个线程的index == arrWT.length的条件不成立不就继续可以执行了
      

  2.   

    那应该这样理解吧:notify()是唤醒其他线程但不是满了之后唤醒,相反是每次push()并且没满的时候唤醒其他线程一次(无论消费者线程是否wait()都试着去唤醒)。是这样吗?
      

  3.   

    准确的说notify是唤醒在 你锁的那个对象上 等待的某一个线程,当然也可能是当前线程,也可能是其他线程,关键是谁能获得CPU了,因为notify一次只能唤醒一个线程,因此,大多数情况下使用notifyAll,可以唤醒所有的等待线程,但是哪一个线程能获得CPU也是不一定的。
      

  4.   

    那为什么不将notifyAll()
    放在while里面呢。这样就可以做到index == arrWT.length成立时去唤醒,不用每次都唤醒!public synchronized void push(WoTou wt) {
      while(index == arrWT.length) {
       try {
        this.notifyAll();  
        this.wait();
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
      }
      arrWT[index] = wt;
      index ++;
     }
      

  5.   

    推荐一本书看吧:
    java多线程设计模式,铁道出版社,结城浩著 博硕文化译 日本人写的 个人感觉非常通俗易懂
      

  6.   

    我觉得这段代码的逻辑应该如下
        public synchronized void push(WoTou wt) {
            while (index != arrWT.length) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.notifyAll();
            arrWT[index] = wt;
            index++;
        }也就是应该是不等的时候wait。但即使这样我觉得也不应该在push前加synchronized修饰恐怕需要更多的代码才能判断
      

  7.   

    呵呵,尚学堂的代码.执行wait()时生产者消除阻塞,并释放锁,此时生产者线程停留在wait()处(和sleep类似,但是sleep不释放锁),
    等到消费者唤醒生产者时,生产者从wait()处继续往下执行.1L的代码表示满了就休息(wait),每生产一个就叫所有消费者,消费者进来消费,而生产者则阻塞知道消费者唤醒它。  LZ是担心的应该是满了就阻塞,没法叫消费者了,但实际上每生产一个就叫一次消费者,所以生产者阻塞后,肯定有消费者来消费,继而叫醒生产者.4L的代码是只有满了才叫消费者.两个都是可行的,个人更喜欢4L的。
      

  8.   

    “这是一个生产者线程的一部分,我的理解应该是:满了之后就用wait()阻塞,之后用notify()去唤醒消费者线程。但是wait()之后是不是应该就阻塞住了啊?我感觉有点矛盾呢,不知道我哪里理解有误,高手指点一下 多谢!”这样解释吧。
    1. 我想put个任务给生产者线程(假说产者线程就是张三)。
    2. 张三发现他已经满负荷了,于是让我等待 (this.wait();  就是这个意思。)
    3.这样我就一直等啊等,直到有另外一个人(王五,他是个消费者)他消费掉了一个东东,就是说张三现在有闲了。 王五肯定会发个notify给我的 (就是 调用 张三的notify()方法啦)
    4。这样我就从wait状态继续了,
            this.notifyAll();
            arrWT[index] = wt;
            index++;
        这三句就是说,我现在放了个东西进去了,通知王五去处理.
    例子中,
    我,王五  都是线程。
    而 张三  只是个仓库(容器), 我跟王五都跟这个张三仓库有关系。