黑马程序员技术交流社区
标题:
多线程问题,求大侠指点哪儿出问题了,半天没找到问题
[打印本页]
作者:
vampire★sky
时间:
2013-8-15 14:24
标题:
多线程问题,求大侠指点哪儿出问题了,半天没找到问题
以下程序的意思是,有一个仓库资源为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());
}
}
}
}
}
作者:
vampire★sky
时间:
2013-8-15 14:38
已经自己解决问题了。锁住的对象和调用notify()和wait()方法的对象不一致引起上面的问题
作者:
神之梦
时间:
2013-8-15 22:10
vampire★sky 发表于 2013-8-15 14:38
已经自己解决问题了。锁住的对象和调用notify()和wait()方法的对象不一致引起上面的问题 ...
不错,不过代码如果放<>这里面,会方便别人复制的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2