Я - новичок Java (и разработчик RoR).Java wait and notifyAll: IllegalMonitorStateException
У меня есть простая программа. Бал является общим игроком. Бал должен быть передан произвольному Игроку.
Ok здесь идет код:
class Ball {
private int currentPlayer;
public void setCurrentPlayer(int currentPlayer, int fromWho) {
this.currentPlayer = currentPlayer;
System.out.println("Ball:setCurrentPlayer " + fromWho + " ---> " + currentPlayer);
}
public int getCurrentPlayer() {
return currentPlayer;
}
}
class Player implements Runnable {
private int myID;
private Ball ball;
private int playersCount;
java.util.Random rnd;
public Player(int id, Ball ball, int playersCount) {
myID = id;
this.ball = ball;
this.playersCount = playersCount;
rnd = new java.util.Random(id);
}
public void run() {
int nextPlayer;
while (true) {
synchronized (ball) {
if (ball.getCurrentPlayer() == myID) {
nextPlayer = rnd.nextInt(playersCount);
System.out.println("Player nr. " + myID + " ---> " + nextPlayer);
ball.setCurrentPlayer(nextPlayer, myID);
ball.notifyAll();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class Start {
public static void main(String[] argv) throws Exception {
Ball p = new Ball();
System.out.println("MAIN: ball will be in player: " + p.getCurrentPlayer());
final int playersCount = 5;
for (int i = 0; i < playersCount; i++) {
(new Thread(new Player(i, p, playersCount))).start();
}
while (true) {
Thread.sleep(500);
System.out.println("MAIN: ball is in player : " + p.getCurrentPlayer());
}
}
}
Но это не работает. Я получаю исключение: IllegalMonitorStateException
.
Как это исправить?
Javadoc для этого исключения объясняет, что это значит. http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalMonitorStateException.html Многие проблемы могут быть решены путем чтения документации;) –