站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题调试和运行得出不同结果

调试和运行得出不同结果

摘要: 调试和运行得出不同结果


源代码如下:
class Buffer2
{
private int value;
private boolean isEmpty=true;
synchronized void put(int i)
{
while(!isEmpty)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
}
value=i;
isEmpty=false;
notify();
}
synchronized int get()
{
while (isEmpty)
try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
isEmpty=true;
notify();
return value;
}
}
class Sender2 extends Thread
{
private Buffer2 bf;
public Sender2(Buffer2 bf)
{
this.bf=bf;
}
public void run()
{
for (int i=1;i-#60;6;i++)
{
bf.put(i);
System.out.println(-#34;Sender put:-#34;+i);

}
}
public static void main(String args[])
{
Buffer2 bf=new Buffer2();
(new Sender2(bf)).start();
(new Receiver2(bf)).start();
}

}
class Receiver2 extends Thread
{
private Buffer2 bf;
public Receiver2(Buffer2 bf)
{
this.bf=bf;
}
public void run()
{
for (int i=1;i-#60;6;i++)
{
System.out.println(-#34;/t/t Receiver get :-#34;+bf.get());
}

}
}

正常运行时输出(错误的):

Sender put:1
Sender put:2
Receiver get :1
Sender put:3
Receiver get :2
Sender put:4
Receiver get :3
Sender put:5
Receiver get :4
Receiver get :5
调试时输出(正确的):

Sender put:1
Receiver get :1
Sender put:2
Receiver get :2
Sender put:3
Receiver get :3
Sender put:4
Receiver get :4
Sender put:5
Receiver get :5

请高手指教,谢谢!





没有同步


结果是正确的啊!
你看他数字取的是对的,只不过两个线程System.out.println的时间差原因引起print顺序和下面不一样而已。


分析下:

调试的时候,估计sender线程put一个值后,应该是被你中断了一下,同样Receiver线程get一个值后也是,这种情况下不会发生时间差。也很少触发wait();

电脑运行的时候则不一样,造成上面结果的可能顺序有很多,
例如这样:
sender put 1
sender 打印1
Receiver get 1
sender put 2
sender 打印2
Receiver 打印1 //注意Receiver 比Sender后打印!!!
.......


运行的时候速度是很快的,系统调度线程什么顺序都可能发生,又比如:


sender put 1
sender 打印1
sender put 2 被阻止 wait()
Receiver get 1
sender put 2
sender 打印2
Receiver 打印1 //注意Receiver 比Sender后打印!!!
....

也符合你的结果


可是为什么总是这个结果:
Sender put:1
Sender put:2
Receiver get :1
Sender put:3
Receiver get :2
Sender put:4
Receiver get :3
Sender put:5
Receiver get :4
Receiver get :5

而其他的顺序一次也不出现呢?


你运气不好


也可以说是运气好 呵呵


你多试几次看看,应该会有不同结果出现的


改成这样就行了:
class Buffer2
{
private int value;
private boolean isEmpty=true;
synchronized void put(int i)
{
while(!isEmpty)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
}
value=i;
System.out.println(-#34;Sender put:-#34;+i);
isEmpty=false;
notify();
}
synchronized int get()
{
while (isEmpty)
try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
System.out.println(-#34;/t/t Receiver get :-#34;+value);
isEmpty=true;
notify();
return value;
}
}
class Sender2 extends Thread
{
private Buffer2 bf;
public Sender2(Buffer2 bf)
{
this.bf=bf;
}
public void run()
{
for (int i=1;i-#60;6;i++)
{
bf.put(i);


}
}
public static void main(String args[])
{
Buffer2 bf=new Buffer2();
(new Sender2(bf)).start();
(new Receiver2(bf)).start();
}

}
class Receiver2 extends Thread
{
private Buffer2 bf;
public Receiver2(Buffer2 bf)
{
this.bf=bf;
}
public void run()
{ int count;
for (int i=1;i-#60;6;i++)
{
count=bf.get();
}

}
}



如果理解不了,可以这样:

把Receiver2 里面的打印语句变成synchronized块:

synchronized(this){
System.out.println(-#34;/t/t Receiver get :-#34;+bf.get());
}





顺便请问逍遥一个问题:
synchronized public void run()
{
while(true)
{
}
}

里面的while(true)是什么意思?
true是指什么?
synchronized已经互斥了,要while(true)干什么?
true何时变为false?
谢谢!


while(true)
{
}


是一个无限循环,
程序里是while (isEmpty)不是while (true)

因为你不能保证一次wait()之后数据就被取走了,可能要wait()3次,4次等等。
数据被取走或者被放进去的时候,isEmpty会发生变化,这个时候循环才会结束。




↑返回目录
前一篇: 找不到方法错误main
后一篇: 关于嵌套类,有些疑惑 高手帮忙解决