поскольку им всем придется снова получить один и тот же монитор - но все будут уведомлены, поэтому, как только первый выйдет из синхронизированного блока, следующий получит блокировку и т. д.

совсем понимаю какwait а такжеnotify (изObject), и в результате я вынужден ограничить свои попытки в следующем разделе кода.

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

В настоящее время я получаю IllegalMonitorStateException при вызовеMain.main.wait();но я не понимаю почему. Из того, что я вижу, мне нужно синхронизироватьRunner.run, но при этом я предполагаю, что он будет уведомлять только один поток, когда идея состоит в том, чтобы уведомить их всех.

Я смотрел наjava.util.concurrent, но я не могу найти подходящую замену (может быть, я просто что-то упустил).

Ответы на вопрос(2)

Ваш ответ на вопрос