Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
56_Java.pdf
Скачиваний:
210
Добавлен:
18.02.2016
Размер:
2.39 Mб
Скачать

Скачано с сайта http://ivc.clan.su

3. Оператор synchronized удобно использовать при необходимости синхронизации кода внешнего объекта при обращении к нему из внутреннего объекта (объекта внутреннего класса):

public class Outer

{

int data;

...

class Inner

{

void setOuterData ()

{

synchronized (Outer.this) { data =12; }

}

}

}

Взаимодействие потоков: использование методов wait(), notify(), notifyAll()

public final void wait() throws InterruptedException — метод ожидания, позволяющий приостановить работу потока до выполнения некоторого условия (условия ожидания).

public final void notify() и notifyAll() — методы оповещения, которые сообщают ожидающим потокам о том, что произошло событие, влияющее на результат проверки условия ожидания.

Методы являются final-методами, определены в классе Object и наследуются всеми производными классами.

Стандартные образцы кода использования методов

1. Поток, ожидающий выполнения некоторого условия, всегда должен выполнять действия, подобные следующим:

synchronized void doWhenCondition ()

{

while (!condition) wait ();

// ... выполнить то, что требуется, если условие condition = true

}

Замечания:

1.Метод wait() обязательно должен вызываться в синхронизированном коде. В противном случае состояние объекта, для которого вызывается wait(), не может считаться стабильным.

2.Условие ожидания обязательно проверяется в цикле while. Нельзя использовать if.

3.Метод wait() при приостановке потока освобождает блокировку объекта до момента получения оповещения от другого потока, который вызвал метод notify(). Перед выходом из состояния ожидания при получении оповещения блокировка объекта восстанавливается.

4.Если поток находится в состоянии ожидания, выполняя wait(), и другой поток вызывает для объекта данного потока

метод interrupt(), генерируется исключение InterruptedException.

5. Имеются версии метода wait(), для которых в параметре задаётся промежуток времени ожидания.

2. Методы оповещения также вызываются в потоке синхронизированным кодом и информируют об

изменении условия(й) ожидания другие потоки: synchronized void changeCondition ()

{

// ... изменить некоторое значение, которое используется

31

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]