黑马程序员技术交流社区

标题: JAVA多线程问题 [打印本页]

作者: 王轶    时间: 2011-9-28 12:23
标题: JAVA多线程问题
为什么JAVA里面的wait方法最好要放在while循环里面呢?
作者: 匿名    时间: 2011-9-28 15:39
wait()必须放在synchronized块里面是真的   放在while块是逻辑决定的,放在while中的主要目的是防止线程退出
线程的run函数执行完后线程就退出了。
作者: 匿名    时间: 2011-9-28 16:10
标题: 回复 楼主 的帖子
这个可以根据自己的设计需求来定,可以用if,也可以用while,根据需求区分执行的[b]次数[/b]就可以了
作者: 匿名    时间: 2011-9-28 17:08
如果你确认方法wait一次就能做完,当然可以用if+wait方法了,但一般在应用中,可能需要执行wait后的操作多次,所以用while+wait方法。所以,用while还是用if还是用什么根据程序决定吧(if的例子在张孝祥老师编的《java就业培训教程》p210有例子)。

wait()是在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。
对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
     }
此方法只应由作为此对象监视器的所有者的线程来调用。
作者: 匿名    时间: 2011-9-28 22:01
标题: 回复 楼主 的帖子
因为只有知道什么条件下线程进入等待状态,才能再次的启用线程。
试想下,如果不用while你想让等待的线程恢复工作时就没办法了。
作者: 匿名    时间: 2011-9-29 18:04
wait()放在while循环里面是为了保证,当线程被唤醒之后,再次检查while条件,明确接下来该执行的代码,因为当该线程冻结时有可能条件已经有其他线程更改。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2