源代码如下:
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<6;i++)
{
bf.put(i);
System.out.println("Sender 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()
{
for (int i=1;i<6;i++)
{
System.out.println("\t\t Receiver get :"+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请高手指教,谢谢!
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<6;i++)
{
bf.put(i);
System.out.println("Sender 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()
{
for (int i=1;i<6;i++)
{
System.out.println("\t\t Receiver get :"+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 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("Sender put:"+i);
isEmpty=false;
notify();
}
synchronized int get()
{
while (isEmpty)
try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
System.out.println("\t\t Receiver get :"+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<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<6;i++)
{
count=bf.get();
}
}
}
System.out.println("\t\t Receiver get :"+bf.get());
}
synchronized public void run()
{
while(true)
{
}
}里面的while(true)是什么意思?
true是指什么?
synchronized已经互斥了,要while(true)干什么?
true何时变为false?
谢谢!
{
}
是一个无限循环,
程序里是while (isEmpty)不是while (true)因为你不能保证一次wait()之后数据就被取走了,可能要wait()3次,4次等等。
数据被取走或者被放进去的时候,isEmpty会发生变化,这个时候循环才会结束。