当前位置:编程学习 > JAVA >>

多线程中为什么wait()必须放在while循环中?

网上挺多解释的,但是总感觉说的很含糊不够透彻,希望有真正理解的给菜鸟解释一下 --------------------编程问答-------------------- wait()只有要求必须放在同步代码块或同步函数里吧 --------------------编程问答-------------------- 没有必须放到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就是while
2、放在while里面,是防止出于waiting的对象被别的原因调用了唤醒方法,但是while里面的条件并没有满足(也可能当时满足了,但是由于别的线程操作后,又不满足了),就需要再次调用wait将其挂起。
3、其实还有一点,就是while最好也被同步,这样不会导致错失信号。

希望下面的文章对您有帮助:
http://www.lantaozi.com/article/52217def0634c98c16000002 --------------------编程问答-------------------- 一般放在while中,不是必须。。。 --------------------编程问答-------------------- 条件检查时候,应该放在while中,如果不是条件检查,可以不用。 --------------------编程问答-------------------- 先搞清楚为什么要用,才知道它用在什么地方。
wait就是等待嘛,那为什么要等呢,那是比如你监视的端口或其它任务还没来,所以要等。

就像一个狙击手,事先埋伏好,等有人来时就开枪,再来一个时再开枪。
没人来时就要等,
直到任务完成或其它中断任务的情部分发生。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,