Java多线程 为什么加了wait()函数 运行结果就和想象中的不同了

来源:百度知道 编辑:UC知道 时间:2024/07/06 14:46:57
哪位牛人帮我看看下面的代码 问题是如果现在注释掉wait()函数 读写正常(死循环 不间段的读写) 如果没有注释掉wait()函数部分 它只是写入一个数 看了老半天 都不知问题出在哪....????
(尽量多发表点看法啊 看和老师说的有什么不同)

package MultiPak;

import java.util.*;

public class ThreadDmeo {
static boolean hasdate = true;
static int date;

public static void main(String agrv[])
{
Write w = new Write();
Read r = new Read();
w.start();
r.start();
}
}

class Write extends Thread{
int count = 0;
Random r = new Random();

synchronized public void run()
{
for(;;){
while (ThreadDmeo.hasdate == false) {
/*try{
wait();
}
catch(InterruptedException ie1)
{
}*/
}
count++;
ThreadDmeo.date = r.nextInt();
System.out.println("写入的第" + count + "个数

根据原理:通过对一个线程调用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()。
所以只能够读写一遍