Java espera y notifica a todos: IllegalMonitorStateException

Soy novato de Java (y desarrollador de RoR).

Tengo un programa simple. La pelota se comparte entre los jugadores. La pelota debe ser pasada al jugador aleatorio.

Ok aquí va el código:

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() );
        }
    }
}

Pero no funciona. Tengo la excepción:IllegalMonitorStateException.

¿Cómo puedo arreglar esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta