线程中生产/消费的问题,书上居然骗我!

tiky_6228769 2006-02-15 03:32:30
以下代码是书上的原代码,我运行的结果却和它说的实际结果不一样,不知道什么原因
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
而我运行出来却不是,你们运行看看,放在同个包里面就行,请教
...全文
96 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiky_6228769 2006-02-16
  • 打赏
  • 举报
回复
楼上的,我理解没错啊,书上也是这么说的,确实是线程安全的问题
而且强调了,只有“生产”出的一个数字,被“消费”以后,才会继续生产
HoldInteger.java里不是有个控制标志的嘛
jlbqd 2006-02-16
  • 打赏
  • 举报
回复
是啊~控制标志是控制当没有生产的时候去消费啊~

你看运行的结果,都是先生产再消费的~

你是不是认为应该是生产一个(只生产一个),然后再消费一个,然后再.....
这个属于线程同步,并不是线程安全,估计书后面会讲到的
jlbqd 2006-02-15
  • 打赏
  • 举报
回复
没有错啊~估计是楼主理解问题吧~
书上说的结果是:产生一个0,消费一个0
应该是说先产生和后消费,产生几次并没有说啊~,所以也可以生产一批再消费一批。
这个例子说明的就是多线程安全的问题。
因为每次Consume retrieved的结果都是先Producer set sharedInt to 的


panzi667 2006-02-15
  • 打赏
  • 举报
回复
up
tiky_6228769 2006-02-15
  • 打赏
  • 举报
回复
UP
tiky_6228769 2006-02-15
  • 打赏
  • 举报
回复
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

这是我刚运行的结果,看嘛,明显有问题

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧