A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王轶 黑马帝   /  2011-9-28 12:23  /  1857 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么JAVA里面的wait方法最好要放在while循环里面呢?

5 个回复

正序浏览
黑马网友  发表于 2011-9-29 18:04:42
地板
wait()放在while循环里面是为了保证,当线程被唤醒之后,再次检查while条件,明确接下来该执行的代码,因为当该线程冻结时有可能条件已经有其他线程更改。
回复 使用道具 举报
黑马网友  发表于 2011-9-28 22:01:52
报纸

回复 楼主 的帖子

因为只有知道什么条件下线程进入等待状态,才能再次的启用线程。
试想下,如果不用while你想让等待的线程恢复工作时就没办法了。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 17:08:59
板凳
如果你确认方法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
     }
此方法只应由作为此对象监视器的所有者的线程来调用。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 16:10:35
藤椅

回复 楼主 的帖子

这个可以根据自己的设计需求来定,可以用if,也可以用while,根据需求区分执行的[b]次数[/b]就可以了

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 15:39:07
沙发
wait()必须放在synchronized块里面是真的   放在while块是逻辑决定的,放在while中的主要目的是防止线程退出
线程的run函数执行完后线程就退出了。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马