Java Aguarde e notifique: IllegalMonitorStateException

Eu não entendo completamente comowait enotify (doObject) funcionam e, como resultado, sou forçado a diminuir minhas tentativas na seção de código a segui

Main.java:

import java.util.ArrayList;

class Main
{
  public static Main main = null;

  public static int numRunners = 4;
  public static ArrayList<Runner> runners = null;

  public static void main(String[] args)
  {
    main = new Main();
  }

  Main()
  {
    runners = new ArrayList<Runner>(numRunners);

    for (int i = 0; i < numRunners; i++)
    {
      Runner r = new Runner();
      runners.add(r);
      new Thread(r).start();
    }

    System.out.println("Runners ready.");
    notifyAll();
  }
}

Runner.java:

class Runner implements Runnable
{
  public void run()
  {
    try
    {
      Main.main.wait();
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }
}

Atualmente, recebo uma IllegalMonitorStateException ao chamarMain.main.wait();, mas não entendo o porquê. Pelo que posso ver, preciso sincronizarRunner.run, mas, ao fazê-lo, presumo que apenas um segmento será notificado, quando a ideia for notificar todos ele

Eu olhei parajava.util.concurrent, mas não consigo encontrar um substituto adequado (talvez esteja apenas faltando alguma coisa

questionAnswers(2)

yourAnswerToTheQuestion