Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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线程、监视器等。。。。_Java_Multithreading_Thread Safety - Fatal编程技术网

了解Java线程、监视器等。。。。

了解Java线程、监视器等。。。。,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我正在做一个项目,我需要循环排队和穿线来模拟火车上下乘客。我正在使用Object.notify和Object.wait控制线程。我是线程应用程序的新手,我遇到了一个我不理解的错误: Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at Station.run(Station.java:37) at

我正在做一个项目,我需要循环排队和穿线来模拟火车上下乘客。我正在使用Object.notify和Object.wait控制线程。我是线程应用程序的新手,我遇到了一个我不理解的错误:

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at Station.run(Station.java:37)
    at java.lang.Thread.run(Unknown Source)
这是我的主要任务

public static void main(String[] args) 
    {
        Track theTrack = new Track();
        Station[] stations = {new Station(TRAIN_STATION_TYPE.ASHMONT)};
        Train[] trains = {new Train(TRAIN_TYPE.A_TRAIN, theTrack)};  

        Thread[] stationThreads = new Thread[stations.length]; 
        Thread[] trainThreads = new Thread[trains.length]; 

        theTrack.setStations(stations);
        theTrack.setTrains(trains); 
        for(int i = 0; i<stations.length; i++)
        {
            stationThreads[i] = new Thread(stations[i]);
            stationThreads[i].start(); 
        }
        for(int i = 0; i<trains.length; i++)
        {
            trainThreads[i] = new Thread(trains[i]);
            trainThreads[i].start(); 
        }
    }
publicstaticvoidmain(字符串[]args)
{
跟踪跟踪=新跟踪();
车站[]车站={新车站(火车站类型:ASHMONT)};
列车[]列车={新列车(A型列车,列车轨道)};
Thread[]stationThreads=新线程[stations.length];
螺纹[]列螺纹=新螺纹[trains.length];
跟踪设置(站);
跟踪设置列车(列车);
对于(int i=0;i
这试图告诉您,您正在对一个对象调用notify,而不在该对象的
synchronized
块中。它可能位于以下位置:

stationBoarded.notify();
您需要将其与以下内容同步:

synchronized (stationBoarded) {
    stationBoarded.notify();
}
或者可能是其中之一:

trainInStation.notify(); // notify the train to let the passengers off
...
trainInStation.notify();//notify the train to depart
基本上,您可以在任何地方调用
notify()
notifyAll()

这试图告诉您,您正在对一个对象调用notify,而不在该对象的
synchronized
块中。它可能位于以下位置:

stationBoarded.notify();
您需要将其与以下内容同步:

synchronized (stationBoarded) {
    stationBoarded.notify();
}
或者可能是其中之一:

trainInStation.notify(); // notify the train to let the passengers off
...
trainInStation.notify();//notify the train to depart

基本上,在调用
notify()
notifyAll()
的任何地方,您都需要在wait()调用周围添加一个同步块。

您需要在wait()调用周围添加一个同步块。

如果不先获取对象的锁,就不能在对象上调用notify或wait

在Station.java中,您正在run()方法中调用trainStation.notify(),但是代码块没有与trainStation同步


对正在调用wait或notify的对象同步调用wait或notify的代码块,立即出现的问题应该会消失。

如果不先获取对象的锁,就不能调用notify或notify

在Station.java中,您正在run()方法中调用trainStation.notify(),但是代码块没有与trainStation同步

对正在调用wait或notify的对象同步调用wait或notify的代码块,立即出现的问题就会消失