了解Java线程、监视器等。。。。
我正在做一个项目,我需要循环排队和穿线来模拟火车上下乘客。我正在使用Object.notify和Object.wait控制线程。我是线程应用程序的新手,我遇到了一个我不理解的错误:了解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
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的代码块,立即出现的问题就会消失