wait()只有要求必须放在同步代码块或同步函数里吧

解决方案 »

  1.   

    没有必须放到while循环里这一说吧。不过通常都放到while循环里,因为很多线程同步块里都具有while循环。
    而你如果在while外面进行等待,基本上不能对程序进行控制。通常,你都需要分析或者控制循环里数据的执行情况。
    如果你的wait放在循环里,你就可以看到让循环停下来,让你看个清楚。如果放到外面,循环都执行完了。你到外面等上(wait)一百年,你也看不到你想看的情况。
      

  2.   

    不放到循环里也不会报错的,就是这样的话wait就完全没作用了。
      

  3.   

    网上说得比较多的可能是“虚假唤醒”,字面上不太好理解,这是多线程的一个特性,无论是windows还是linux,它们的多线程体系,都有这个特性。实际上,自己可以这样理解:比如调用notifyAll,唤醒对应锁上的所有线程,那所有wait的线程,就从wait方法返回了,但自己程序里的逻辑,是不是期望这种结果呢?所以针对每个wait,还要重复判断一下,确定此时是不是真的该醒来了,所以用for/while,而不是if判断。
      

  4.   

    ......好吧放入while循环这种事情并非强制性的 不过wait()函数重点不光是阻塞 而是释放当前资源交给其他线程处理 LZ想想看 如果其他线程处理完毕后 唤醒阻塞中的线程的时候 是不是要根据其他线程的处理结果重新制定执行流程呢?所以才用while使部分代码重新执行一次 这不是必须的
      

  5.   

    永远不要在循环的外面调用wait():在一个合格的多线程程序中,这是必须的。原因请查看《Effective Java》
      

  6.   

    没听说必须放while里,放哪都是根据要实现的逻辑决定的
      

  7.   

    1、一般来说,wait肯定是在某个条件调用的,不是if就是while
    2、放在while里面,是防止出于waiting的对象被别的原因调用了唤醒方法,但是while里面的条件并没有满足(也可能当时满足了,但是由于别的线程操作后,又不满足了),就需要再次调用wait将其挂起。
    3、其实还有一点,就是while最好也被同步,这样不会导致错失信号。希望下面的文章对您有帮助:
    http://www.lantaozi.com/article/52217def0634c98c16000002
      

  8.   

    条件检查时候,应该放在while中,如果不是条件检查,可以不用。
      

  9.   

    先搞清楚为什么要用,才知道它用在什么地方。
    wait就是等待嘛,那为什么要等呢,那是比如你监视的端口或其它任务还没来,所以要等。就像一个狙击手,事先埋伏好,等有人来时就开枪,再来一个时再开枪。
    没人来时就要等,
    直到任务完成或其它中断任务的情部分发生。
      

  10.   

    如果是两个狙击手,在同时等待一个人,第一个人先打死了,第二个人还要再开一枪?针对两个线程同时等待还是要加这个while的
      

  11.   

    只要条件不满足,就一直wait,条件一旦满足了,就不wait了,while会一直判断,知道满足条件。
    synchronized (obj) {
     while (<condition does not hold>)
     obj.wait();
     ... // Perform action appropriate to condition
     }
    如果是if,判断一次就完了,就木有while科学了。
      

  12.   

    简单一点的说,因为当一个等待线程醒来的时候,可能互斥量被其他的线程(notifyAll 后可能又改变了互斥量的值,或者线程的假醒来 ,或者  等等)又改变了,所以需要重复判断条件。
      

  13.   


    if(等待的条件) {
    wait();
    }
    do somethingwhile()等待的条件 {
    wait();
    }
    do somethingif和while有什么区别呢。
    一个只执行一次,一个等到条件满足为直。
    根据实际需求而定。
    比如多线程读写同一个文件吧。
    要写入文件。
    当用if时,发现有其它线程在读,,执行一次就拜拜了。
    如果是while,我可等,等到都没有读写了,本线程在写入,其它时候都睡觉。