Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码抛出一个非法的MonitorStateException?_Java_Multithreading_Monitoring_Wait - Fatal编程技术网

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,我认为您在某处。