Microsoft Visual J++. Создание приложений и аплетов на языке Java

Ожидание извещения


Если вам нужно организовать взаимодействие задач таким образом, чтобы одна задача управляла работой другой или других задач, вы можете воспользоваться методами wait, notify и notifyAll, определенными в классе Object.

Метод wait может использоваться либо с параметром, либо без параметра. Этот метод переводит задачу в состояние ожидания, в котором она будет находиться до тех пор, пока для задачи не будет вызван извещающий метод notify, notifyAll, или пока не истечет период времени, указанный в параметре метода wait.

Как пользоваться методами wait, notify и notifyAll?

Метод, который будет переводиться в состояние ожидания, должен быть синхронизированным, то есть его следует описать как synchronized:

public synchronized void run()

{

  while (true)

  {

    . . .

    try

    {

      Thread.wait();

    }



    catch (InterruptedException e)

    {

    }

  }

}

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

Ниже мы привели пример задачи, вызывающией метод notify:

public void run()

{

  while (true)

  {

    try

    {

      Thread.sleep(30);

    }

    catch (InterruptedException e)

    {

    }

    synchronized(STask)

    {

      STask.notify();

    }

  }

}

Эта задача реализована в рамках отдельного класса, конструктору которого передается ссылка на задачу, вызывающую метод wait. Эта ссылка хранится в поле STask.

Обратите внимание, что хотя сам метод run не синхронизированный, вызов метода notify выполняется в синхронизированном режиме. В качестве объекта синхронизации выступает задача, для которой вызывается метод notify.



Содержание раздела