Java Attendre et Informer: IllegalMonitorStateException

Je ne comprends pas complètement comment wait et notify (de Object) de travail, et comme un résultat, je suis obligé de maigrir mes tentatives dans la section suivante de code.

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!");
  }
}

Actuellement je reçois un IllegalMonitorStateException lors de l'appel de Main.main.wait();, mais je ne comprends pas pourquoi. De ce que je peux voir, j'ai besoin de synchroniser Runner.run, mais en le faisant, je suppose qu'il ne serait que de notifier à un fil, lorsque l'idée est d'informer tous les.

J'ai regardé java.util.concurrent, mais je ne peux pas trouver un substitut approprié (peut-être que je suis juste en manque de quelque chose).

  • Vous ne devez jamais utiliser wait et notify. Elles étaient nécessaires à l'ancienne Java, mais maintenant, ils devraient seulement être utilisés par des personnes qui écrivent des bibliothèques. Vous devez maintenant utiliser les installations en java.util.de façon concomitante.
  • D'accord avec toto2, même après l'ajout de la synchronisation de ce code ne fonctionnera pas. Ce qui se passe si les principaux appels notifyAll avant tous les autres threads atteindre wait()?
InformationsquelleAutor skeggse | 2011-08-19