以下代码是书上的原代码,我运行的结果却和它说的实际结果不一样,不知道什么原因
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
而我运行出来却不是,你们运行看看,放在同个包里面就行,请教
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
而我运行出来却不是,你们运行看看,放在同个包里面就行,请教
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这是我刚运行的结果,看嘛,明显有问题
书上说的结果是:产生一个0,消费一个0
应该是说先产生和后消费,产生几次并没有说啊~,所以也可以生产一批再消费一批。
这个例子说明的就是多线程安全的问题。
因为每次Consume retrieved的结果都是先Producer set sharedInt to 的
而且强调了,只有“生产”出的一个数字,被“消费”以后,才会继续生产
HoldInteger.java里不是有个控制标志的嘛