Java 为什么这段代码抛出一个非法的MonitorStateException?
请向我解释为什么我的代码在等待函数中抛出一个Java 为什么这段代码抛出一个非法的MonitorStateException?,java,multithreading,monitoring,wait,Java,Multithreading,Monitoring,Wait,请向我解释为什么我的代码在等待函数中抛出一个IllegalMonitorStateException,据我所知,只有在未在同步部分中执行时才会发生这种情况 private void deliver(int target) { Warehouse targetW = targets[target]; targetW.deliver(); System.out.println(name + " starts to deliver too " +
IllegalMonitorStateException
,据我所知,只有在未在同步部分中执行时才会发生这种情况
private void deliver(int target) {
Warehouse targetW = targets[target];
targetW.deliver();
System.out.println(name + " starts to deliver too " +
targetW.getName());
int sleepTime = DELIVERY_TIME / LOADING_CAPACITY;
int counter = 0;
while (counter < LOADING_CAPACITY) {
synchronized (targetW) {
while (!targetW.fill(1)) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
counter++;
try {
sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
leaveMSG(targetW);
targetW.delivered();
}
private void deliver(整数目标){
仓库目标=目标[目标];
targetW.deliver();
System.out.println(name+“也开始交付”+
getName());
int sleepTime=交付时间/装载能力;
int计数器=0;
同时(计数器<负载容量){
已同步(targetW){
而(!targetW.fill(1)){
试一试{
等待();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
计数器++;
试一试{
睡眠(睡眠时间);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
levemsg(targetW);
目标已交付();
}
只能在该对象上的已同步的块内调用wait()
在synchronized(targetW)
内部,您可以调用targetW.wait()
这可能是每个具有内在锁的对象的失败之一。这样的错误不会被发现。我仍然认为应该有一个名为“Lock”的特定类,用于所有locksounds,就像我的信号灯一样。我也在使用它们,但在这种情况下,使用起来更复杂,原因超过了此函数的使用。可能是@Gray的副本,看起来不像是副本。OP:据我所知,只有在未在同步部分完成时才会发生这种情况
。他知道这一点。他的问题更具体一点,因为他忘了指定对象。然而,这个问题的答案对此很有帮助,但问题本身并不是重复的。问题是一样的,但这个答案要好得多:啊,哦,是的,上个月使用了信号量,但又忘记了那个细节^thx@user3038456+1这同样适用于notify/notifyAll,我认为您在某处。