多线程中为什么wait()必须放在while循环中? wait()只有要求必须放在同步代码块或同步函数里吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有必须放到while循环里这一说吧。不过通常都放到while循环里,因为很多线程同步块里都具有while循环。而你如果在while外面进行等待,基本上不能对程序进行控制。通常,你都需要分析或者控制循环里数据的执行情况。如果你的wait放在循环里,你就可以看到让循环停下来,让你看个清楚。如果放到外面,循环都执行完了。你到外面等上(wait)一百年,你也看不到你想看的情况。 不放到循环里也不会报错的,就是这样的话wait就完全没作用了。 网上说得比较多的可能是“虚假唤醒”,字面上不太好理解,这是多线程的一个特性,无论是windows还是linux,它们的多线程体系,都有这个特性。实际上,自己可以这样理解:比如调用notifyAll,唤醒对应锁上的所有线程,那所有wait的线程,就从wait方法返回了,但自己程序里的逻辑,是不是期望这种结果呢?所以针对每个wait,还要重复判断一下,确定此时是不是真的该醒来了,所以用for/while,而不是if判断。 ......好吧放入while循环这种事情并非强制性的 不过wait()函数重点不光是阻塞 而是释放当前资源交给其他线程处理 LZ想想看 如果其他线程处理完毕后 唤醒阻塞中的线程的时候 是不是要根据其他线程的处理结果重新制定执行流程呢?所以才用while使部分代码重新执行一次 这不是必须的 永远不要在循环的外面调用wait():在一个合格的多线程程序中,这是必须的。原因请查看《Effective Java》 没听说必须放while里,放哪都是根据要实现的逻辑决定的 1、一般来说,wait肯定是在某个条件调用的,不是if就是while2、放在while里面,是防止出于waiting的对象被别的原因调用了唤醒方法,但是while里面的条件并没有满足(也可能当时满足了,但是由于别的线程操作后,又不满足了),就需要再次调用wait将其挂起。3、其实还有一点,就是while最好也被同步,这样不会导致错失信号。希望下面的文章对您有帮助:http://www.lantaozi.com/article/52217def0634c98c16000002 条件检查时候,应该放在while中,如果不是条件检查,可以不用。 先搞清楚为什么要用,才知道它用在什么地方。wait就是等待嘛,那为什么要等呢,那是比如你监视的端口或其它任务还没来,所以要等。就像一个狙击手,事先埋伏好,等有人来时就开枪,再来一个时再开枪。没人来时就要等,直到任务完成或其它中断任务的情部分发生。 如果是两个狙击手,在同时等待一个人,第一个人先打死了,第二个人还要再开一枪?针对两个线程同时等待还是要加这个while的 只要条件不满足,就一直wait,条件一旦满足了,就不wait了,while会一直判断,知道满足条件。synchronized (obj) { while (<condition does not hold>) obj.wait(); ... // Perform action appropriate to condition }如果是if,判断一次就完了,就木有while科学了。 简单一点的说,因为当一个等待线程醒来的时候,可能互斥量被其他的线程(notifyAll 后可能又改变了互斥量的值,或者线程的假醒来 ,或者 等等)又改变了,所以需要重复判断条件。 if(等待的条件) {wait();}do somethingwhile()等待的条件 {wait();}do somethingif和while有什么区别呢。一个只执行一次,一个等到条件满足为直。根据实际需求而定。比如多线程读写同一个文件吧。要写入文件。当用if时,发现有其它线程在读,,执行一次就拜拜了。如果是while,我可等,等到都没有读写了,本线程在写入,其它时候都睡觉。 myeclipse8.0 装find bugs 可能没有解!但还是问问,由于用hibernate的hql所以sql的正则不能用啊! 【软件/程序发布】基于Java的听力大师体验(LMX, Listening Master eXperience) 线程不能唤醒了....请帮我看看... 做安装程序的问题~~?? 基础:操作符的问题,请指教!! 关于编译的一个很奇怪的问题 JBuilder7的中文问题-分不够可再加 ◎◎ --为什么时间值会倒退?是因为long型溢出了吗? java画直线,画出来的直线断不了 java java TextArea 中如何分行显示多行字符串
而你如果在while外面进行等待,基本上不能对程序进行控制。通常,你都需要分析或者控制循环里数据的执行情况。
如果你的wait放在循环里,你就可以看到让循环停下来,让你看个清楚。如果放到外面,循环都执行完了。你到外面等上(wait)一百年,你也看不到你想看的情况。
2、放在while里面,是防止出于waiting的对象被别的原因调用了唤醒方法,但是while里面的条件并没有满足(也可能当时满足了,但是由于别的线程操作后,又不满足了),就需要再次调用wait将其挂起。
3、其实还有一点,就是while最好也被同步,这样不会导致错失信号。希望下面的文章对您有帮助:
http://www.lantaozi.com/article/52217def0634c98c16000002
wait就是等待嘛,那为什么要等呢,那是比如你监视的端口或其它任务还没来,所以要等。就像一个狙击手,事先埋伏好,等有人来时就开枪,再来一个时再开枪。
没人来时就要等,
直到任务完成或其它中断任务的情部分发生。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
如果是if,判断一次就完了,就木有while科学了。
if(等待的条件) {
wait();
}
do somethingwhile()等待的条件 {
wait();
}
do somethingif和while有什么区别呢。
一个只执行一次,一个等到条件满足为直。
根据实际需求而定。
比如多线程读写同一个文件吧。
要写入文件。
当用if时,发现有其它线程在读,,执行一次就拜拜了。
如果是while,我可等,等到都没有读写了,本线程在写入,其它时候都睡觉。