根据原理:通过对一个线程调用wait()函数后,线程就进入停滞状态。通过调用notify()可以唤起线程。
没有注销wait时的代码流程如下
write线程流程:
1、如果ThreadDmeo.hasdate == false,将线程停滞;
2、如果ThreadDmeo.hasdate == true,输出一个随机数,并将ThreadDmeo.hasdate设置为false,再将线程唤醒。
read线程流程如下:
1、如果ThreadDmeo.hasdate == true,将线程停滞;
2、如果ThreadDmeo.hasdate == false,读取ThreadDmeo.date,并将ThreadDmeo.hasdate设置为true。
从上面流程可以看出,只要被设置为停滞,线程A(假设为两线程中的任意一个)就不会被再次拉起。虽然这个时候,另外一个线程B可能将ThreadDmeo.hasdate标志重置,但并没有使用notify函数通知线程A启动。因此,最终两个线程都会停滞,因此当然只能读写一个数了。
-->write()-->输出 -->hasdata=false-->write().notify()-->write().wait()--->read--->输出-->hasdata=true-->read().notify()-->read().wait().
这是上面程序的执行流程。可以看出,write().notify和read().notify() 唤醒的是自己。在上面的流程结束的时候,两个线程都在wait()。
所以只能够读写一遍