当前页面: 开发资料首页 → 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会发生变化,这个时候循环才会结束。