2013-04-22 4 views
0

Я - новичок 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.

Как это исправить?

+1

Javadoc для этого исключения объясняет, что это значит. http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalMonitorStateException.html Многие проблемы могут быть решены путем чтения документации;) –

ответ

3

Ожидание на мониторе this без синхронизации на нем; вам нужно подождать ball вместо

+0

OMG, я это заметил. : D Спасибо за ОЧЕНЬ быстрый ответ! Я приму этот ответ за 10 минут ... –

Смежные вопросы