源代码如下:
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请高手指教,谢谢!

解决方案 »

  1.   

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

  2.   

    分析下: 调试的时候,估计sender线程put一个值后,应该是被你中断了一下,同样Receiver线程get一个值后也是,这种情况下不会发生时间差。也很少触发wait(); 电脑运行的时候则不一样,造成上面结果的可能顺序有很多,
    例如这样:
       sender put 1
       sender 打印1
       Receiver get 1
       sender put 2
       sender 打印2 
       Receiver 打印1  //注意Receiver 比Sender后打印!!!
       .......
      

  3.   

    运行的时候速度是很快的,系统调度线程什么顺序都可能发生,又比如:
       sender put 1
       sender 打印1
       sender put 2 被阻止 wait()
       Receiver get 1
       sender put 2
       sender 打印2 
       Receiver 打印1  //注意Receiver 比Sender后打印!!!
      ....也符合你的结果
      

  4.   

    可是为什么总是这个结果:
    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而其他的顺序一次也不出现呢?
      

  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();
    }

    }
    }
      

  6.   

    如果理解不了,可以这样:把Receiver2 里面的打印语句变成synchronized块: synchronized(this){
       System.out.println("\t\t   Receiver get :"+bf.get());
     }
      

  7.   

    顺便请问逍遥一个问题:
    synchronized public void run()
    {
      while(true)
        {
         }
    }里面的while(true)是什么意思?
    true是指什么?
    synchronized已经互斥了,要while(true)干什么?
    true何时变为false?
    谢谢!
      

  8.   

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