Java Wait und Notify: IllegalMonitorStateException

Ich nicht ganz verstehen, wie wait und notify (von Object) Arbeit, und infolgedessen bin ich gezwungen, um schlank nach unten, meine versuche in den folgenden code-Abschnitt.

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

Derzeit bekomme ich eine IllegalMonitorStateException beim Aufruf Main.main.wait();, aber ich verstehe nicht warum. Von was ich sehen kann, brauche ich zum synchronisieren Runner.run, aber damit nehme ich an, es würde nur zu Benachrichtigen, einen thread, wenn die Idee ist, teilen Sie alle.

Habe ich mir angeschaut java.util.concurrent, aber ich kann nicht finden, einen geeigneten Ersatz (vielleicht bin ich auch nur etwas fehlt).

Sie sollten nie warten und Benachrichtigen. Sie waren notwendig, mit der alten Java, aber jetzt sollten Sie nur verwendet werden, von Menschen, die schreiben-Bibliotheken. Sie sollten nun die Einrichtungen in java.util.gleichzeitige.
Vereinbaren Sie mit toto2, auch nachdem Sie die Synchronisierung dieser code wird nicht funktionieren. Was passiert, wenn die main ruft notifyAll, bevor alle anderen threads erreichen wait()?

InformationsquelleAutor skeggse | 2011-08-19

Schreibe einen Kommentar