线程中生产/消费的问题,书上居然骗我!
以下代码是书上的原代码,我运行的结果却和它说的实际结果不一样,不知道什么原因
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.java
public 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.java
public 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.java
public 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
而我运行出来却不是,你们运行看看,放在同个包里面就行,请教