以下代码是书上的原代码,我运行的结果却和它说的实际结果不一样,不知道什么原因
HoldInteger.java:public class HoldInteger { private int sharedInt;
private boolean writeable = true;

public synchronized void setSharedInt(int val){
while(!writeable){
    try{
     wait();
    }
    catch(InterruptedException e){
     System.out.println(e.getMessage());
    }
}
    sharedInt = val;
    writeable = false;
    notify();
}

public synchronized int getSharedInt(){
while(writeable){
try{
wait();
}
    catch(InterruptedException e){
     System.out.println(e.getMessage());
    }   
}
    writeable = true;
    notify();
    return sharedInt;
}
}----------------
ProduceInteger.javapublic class ProduceInteger extends Thread{

private HoldInteger pHold;

public ProduceInteger(HoldInteger h){
pHold = h;
}

public void run(){
for(int i=0;i<10;i++){
pHold.setSharedInt(i);
System.out.println("Producer set sharedInt to "+i);

try{
sleep((int)(Math.random()*3000));
}
catch(InterruptedException e){
System.out.println(e.getMessage());
}
}
}}-------------------ConsumeInteger.javapublic class ConsumeInteger extends Thread{
    
    private HoldInteger cHold;
    
    public ConsumeInteger(HoldInteger c){
     cHold = c;
    }
    
    public void run(){
     int val;
    
     val = cHold.getSharedInt();
     System.out.println("Consume retrieved "+val);
    
     while(val!=9){
     try{
sleep((int)(Math.random()*3000));
}
catch(InterruptedException e){
System.out.println(e.getMessage());
}

val = cHold.getSharedInt();
System.out.println("Consume retrieved "+val);
     }
    }
}---------------------SharedCell.javapublic class SharedCell { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub HoldInteger h = new HoldInteger();
ProduceInteger p = new ProduceInteger(h);
ConsumeInteger c = new ConsumeInteger(h);

p.start();
c.start();
}}书上说的结果是:产生一个0,消费一个0
而我运行出来却不是,你们运行看看,放在同个包里面就行,请教

解决方案 »

  1.   

    Producer set sharedInt to 0
    Consume retrieved 0
    Producer set sharedInt to 1
    Consume retrieved 1
    Producer set sharedInt to 2
    Consume retrieved 2
    Producer set sharedInt to 3
    Producer set sharedInt to 4
    Consume retrieved 3
    Consume retrieved 4
    Producer set sharedInt to 5
    Producer set sharedInt to 6
    Consume retrieved 5
    Producer set sharedInt to 7
    Consume retrieved 6
    Producer set sharedInt to 8
    Consume retrieved 7
    Consume retrieved 8
    Producer set sharedInt to 9
    Consume retrieved 9这是我刚运行的结果,看嘛,明显有问题
      

  2.   

    没有错啊~估计是楼主理解问题吧~
    书上说的结果是:产生一个0,消费一个0
    应该是说先产生和后消费,产生几次并没有说啊~,所以也可以生产一批再消费一批。
    这个例子说明的就是多线程安全的问题。
    因为每次Consume retrieved的结果都是先Producer set sharedInt to 的
      

  3.   

    楼上的,我理解没错啊,书上也是这么说的,确实是线程安全的问题
    而且强调了,只有“生产”出的一个数字,被“消费”以后,才会继续生产
    HoldInteger.java里不是有个控制标志的嘛