线程 wait() notify if while

来源:百度知道 编辑:UC知道 时间:2024/06/01 09:13:15
生产者消费者(当1个生产者1个消费者时),讲过wait()住的生产者线程,等待被叫醒,就是等窝头被消费者消费完了,消费者wait()住,释放窝头对象锁,notify生产者可以生产,释放窝头这个对象锁,生产者这时开始继续生产,
这个时候进入生产者的run开始用的if,后来说如果在wait时被打断,后边的会执行了就,所以改为while,循环判断窝头个数是否为满,
可一般不会被打断,我就用了if试试,结果生产者线程就好像永远也醒不了一样,if后的语句怎么也执行不了,
我上网查了查,有人说线程是不断被系统循环查看而获取消息的,可有人说wait()、notify()的设计正是为了避免循环检测浪费CPU的,两者矛盾
所以我想问系统的notify()到底是怎么做的
notify()完,被叫醒的线程是从wait()后开始吗?要是这样的话wait()后面没东西了,跳出if,if后边为什么不执行了,非得while才执行

api中建议我们调用wait方法(释放对象的锁)是只应该写在while循环里,防止出现虚假唤醒(不满足条件,但是执行while循环体外的代码),notify方法是通知在对象的资源等待池中的某一个线程出来看一下是否满足条件,注意,只是其中一个线程!所以有的情况下当然程序会停在那里不走了!所以,强烈建议使用,notifyAll方法,你说是吧

Thinking in java 3rd:
wait( )能让你在等待世道改变的同时让线程休眠,当(其他线程调用了对象的)notify( )或notifyAll( )的时候,线程自会醒来,然后检查条件是不是改变了.
请注意,wait( )所在的while循环,它的测试条件正是wait要等的东西。乍看上去真有点奇怪——如果你等的是订单,那么醒过来之后肯定会有订单,难道不是吗?问题在于在多线程环境下,还没等WaitPerson醒过来,订单就可能被其他线程给抢走了。所以唯一安全的做法就是套用下面这个wait( )定式:
while(conditionIsNotMet)
wait( );

按课本上来说:
notify()完肯定是接着wait()后执行

我的理解就是:如果没醒过来,订单让别人拿走了,等醒过来,条件不符了就,所以如果if就出事了,还有我测试了一下条件改为boolean这下应该拿不走了,可是还是执行不了if后面豫剧,如果说是对象锁被别人拿走了,没可能,没有其他同步方法,如果说布尔值让人拿走了,可while时也是被别人拿走了。
于是乎:暂且就认为是Java内部机制好了,醒来必须再判断一下