A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

以下程序的意思是,有一个仓库资源为10,少于10的时候不能取,大于10的时候往仓库存每次存一个资源,取的时候每次取4个资源。然后报了这个错误at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.lucus.lock.InputBox.run(Syt.java:45)
at java.lang.Thread.run(Thread.java:619)。不知道哪儿出问题了。


package com.lucus.lock;
public class Syt {
public static void main(String[] args) {
  Box b = new Box();
  InputBox in = new InputBox(b);
  OutputBox out = new OutputBox(b);
  Thread ins = new Thread(in);
  Thread outs = new Thread(out);
  ins.start();
  outs.start();
}
}
class Box {
private int boxs = 10;
public int getBoxs() {
  return boxs;
}
public void setBoxs(int boxs) {
  this.boxs = boxs;
}
}
class InputBox implements Runnable {
private Box boxs;
public InputBox(Box boxs) {
  this.boxs = boxs;
}
@Override
public void run() {
  while (true) {
   synchronized (boxs) {
    if (boxs.getBoxs() < 10) {
     System.out.println("仓库的资源少于10,正在存,别的线程需要等待,倉庫剩下資源為"+this.boxs.getBoxs());
     this.boxs.setBoxs(this.boxs.getBoxs() + 1);
    } else {
     try {
      this.wait();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     this.notify();
    }
   }
  }
}
}
class OutputBox implements Runnable {
private Box boxs;
public OutputBox(Box boxs) {
  this.boxs = boxs;
}
@Override
public void run() {
  while (true) {
   synchronized (boxs) {
    if (this.boxs.getBoxs() < 10) {
     try {
      this.wait();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     this.notify();
    } else {
     this.boxs.setBoxs(this.boxs.getBoxs() - 4);
     System.out.println("正在拿資源,剩下資源為"+this.boxs.getBoxs());
    }
   }
  }
}
}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 淡定

查看全部评分

2 个回复

倒序浏览
已经自己解决问题了。锁住的对象和调用notify()和wait()方法的对象不一致引起上面的问题
回复 使用道具 举报
vampire★sky 发表于 2013-8-15 14:38
已经自己解决问题了。锁住的对象和调用notify()和wait()方法的对象不一致引起上面的问题 ...

不错,不过代码如果放<>这里面,会方便别人复制的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马