问题描述
网上挺多解释的,但是总感觉说的很含糊不够透彻,希望有真正理解的给菜鸟解释一下
解决方案
解决方案二:
wait()只有要求必须放在同步代码块或同步函数里吧
解决方案三:
没有必须放到while循环里这一说吧。不过通常都放到while循环里,因为很多线程同步块里都具有while循环。而你如果在while外面进行等待,基本上不能对程序进行控制。通常,你都需要分析或者控制循环里数据的执行情况。如果你的wait放在循环里,你就可以看到让循环停下来,让你看个清楚。如果放到外面,循环都执行完了。你到外面等上(wait)一百年,你也看不到你想看的情况。
解决方案四:
不放到循环里也不会报错的,就是这样的话wait就完全没作用了。
解决方案五:
网上说得比较多的可能是“虚假唤醒”,字面上不太好理解,这是多线程的一个特性,无论是windows还是linux,它们的多线程体系,都有这个特性。实际上,自己可以这样理解:比如调用notifyAll,唤醒对应锁上的所有线程,那所有wait的线程,就从wait方法返回了,但自己程序里的逻辑,是不是期望这种结果呢?所以针对每个wait,还要重复判断一下,确定此时是不是真的该醒来了,所以用for/while,而不是if判断。
解决方案六:
......好吧放入while循环这种事情并非强制性的不过wait()函数重点不光是阻塞而是释放当前资源交给其他线程处理LZ想想看如果其他线程处理完毕后唤醒阻塞中的线程的时候是不是要根据其他线程的处理结果重新制定执行流程呢?所以才用while使部分代码重新执行一次这不是必须的
解决方案七:
永远不要在循环的外面调用wait():在一个合格的多线程程序中,这是必须的。原因请查看《EffectiveJava》
解决方案八:
没听说必须放while里,放哪都是根据要实现的逻辑决定的
解决方案九:
解决方案十:
1、一般来说,wait肯定是在某个条件调用的,不是if就是while2、放在while里面,是防止出于waiting的对象被别的原因调用了唤醒方法,但是while里面的条件并没有满足(也可能当时满足了,但是由于别的线程操作后,又不满足了),就需要再次调用wait将其挂起。3、其实还有一点,就是while最好也被同步,这样不会导致错失信号。希望下面的文章对您有帮助:
解决方案十一:
一般放在while中,不是必须。。。
解决方案十二:
条件检查时候,应该放在while中,如果不是条件检查,可以不用。
解决方案十三:
先搞清楚为什么要用,才知道它用在什么地方。wait就是等待嘛,那为什么要等呢,那是比如你监视的端口或其它任务还没来,所以要等。就像一个狙击手,事先埋伏好,等有人来时就开枪,再来一个时再开枪。没人来时就要等,直到任务完成或其它中断任务的情部分发生。
解决方案十四:
如果是两个狙击手,在同时等待一个人,第一个人先打死了,第二个人还要再开一枪?针对两个线程同时等待还是要加这个while的
解决方案十五:
只要条件不满足,就一直wait,条件一旦满足了,就不wait了,while会一直判断,知道满足条件。synchronized(obj){while(<conditiondoesnothold>)obj.wait();...//Performactionappropriatetocondition}
如果是if,判断一次就完了,就木有while科学了。
解决方案:
简单一点的说,因为当一个等待线程醒来的时候,可能互斥量被其他的线程(notifyAll后可能又改变了互斥量的值,或者线程的假醒来,或者等等)又改变了,所以需要重复判断条件。
解决方案:
自己看代码,跟着运行轨迹大概走一遍,把思路理理,自然就懂了
解决方案:
if(等待的条件){wait();}dosomethingwhile()等待的条件{wait();}dosomething
if和while有什么区别呢。一个只执行一次,一个等到条件满足为直。根据实际需求而定。比如多线程读写同一个文件吧。要写入文件。当用if时,发现有其它线程在读,,执行一次就拜拜了。如果是while,我可等,等到都没有读写了,本线程在写入,其它时候都睡觉。