while(writeable)
{
  try{
    wait();
    System.out.println("aaaaa");
  }
  catch(..)
  {..}
}为什么书上说wait一定要放在while循环中,线程不是运行到wait()就不动了吗?一直到notify().
那个输出语句只输出一次还是不停输出?

解决方案 »

  1.   

    因为只有知道什么条件下线程进入等待状态  才能再次的启用线程
      试想下  如果不用while 你想让等待的线程恢复工作时就没办法了  明白死琐吧还有其实不是运行到wait()就不动了 而是当此线程1运行到wait()的时候就进入等待状态  别的优先高的继续运行 当等待的线程满足条件后 它会继续它没完成的工作  只是暂时的进入休眠
      

  2.   

    还是有些不明白,我的意思是说为什么while不可以用if替代?
      

  3.   

    wait()必须放在synchronized块里面是真的 放在while块是逻辑决定的 
    还有一些大哥不要用那种口吻误导人了
      

  4.   

    放在while里?!
    如果要是需要这样做的话那么不等于自己些个wait()函数差不多了。你哪本书看到的?!告诉大家,我们别买!
    wait()需要放大同步块或者同步函数中,也就是楼上说的synchronized中
      

  5.   

    什么东西都不是绝对的,如果你可以保证只要一旦被notify即为你所希望,那么你也可以不用循环。不过这样不出错的话算你幸运。你可以看看jdk里面的说明,wait永远都是放在循环里面
      

  6.   

    放在while中的主要目的是防止线程退出
    线程的run函数执行完后线程就退出了。所以一般在run函数中用while循环。
    在你的代码中,线程每被notify一次就打印aaaaaa
    如果不用while 线程被notify一次就退出了。当线程的目的为不断轮讯,刷新,查询等时就不符合要求了。
      

  7.   

    让我们考虑一下serverSocket.accept(),一般情况下我们都是把它放在while(flag)里面来接受多个socket连接,服务多个客户端,但这只是应用逻辑层面上的因素,而不在语言特性。ok,现在我做一个遥控炸弹,serverSocket.accept();bomb.explode();我一发个请求炸弹就爆了,如果不是炸弹加了密,要防止引爆的时候输错密码无法重新输入或者引爆的时候要加确认,还用while()做什么用呢?
      

  8.   

    换句话说,如果不加确认,那么炸死的有可能就是你自己
    如果加确认,那么用while循环就是最简单的办法