Пакет | flash.concurrent |
Класс | public final class Condition |
Наследование | Condition Object |
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.5, AIR 3.5 |
Ниже приводится пример возможного рабочего процесса для использования объекта Condition.
- Перед использованием объекта Condition первый поток worker должен принять право владения связанным взаимным исключением условия, вызвав метод
lock()
илиtryLock()
объекта Mutex. - Код потока worker работает с общим ресурсом, пока определенное условие не получит значения false, после чего поток worker не сможет продолжать работу с общим ресурсом. Например, если общий ресурс представляет собой набор данных для обработки и в нем больше не остается необработанных данных, поток worker не может продолжать работу.
- На этом этапе необходимо вызвать метод
wait()
объекта Condition, чтобы приостановить выполнение потока worker и освободить право владения взаимным исключением. - В свое время второй поток worker принимает право владения взаимным исключением. Так как взаимное исключение доступно, код второго потока worker может безопасно выполнять операции с общим ресурсом. Второй поток worker выполняет все необходимые действия для удовлетворения условия, чтобы первый поток worker мог возобновить свою работу. Например, если первый поток worker не имеет данных для обработки, второй поток worker может передать в общий ресурс дополнительные данные.
- На этом этапе условие, связанное с работой первого потока worker, выполняется, о чем необходимо уведомить этот поток worker. Чтобы уведомить первый поток worker, код второго потока worker вызывает метод
notify()
илиnotifyAll()
объекта Condition. - Помимо вызова
notify()
второй поток worker должен освободить право владения взаимным исключением. Это осуществляется путем вызова методаunlock()
объекта Mutex или методаwait()
объекта Condition. Так как первый поток worker вызывал методwait()
, право владения взаимным исключением возвращается ему. После этого возобновляется выполнение кода в первом потоке worker со строки, которая следует за вызовом методаwait()
.
Класс Condition относится к типу объектов, которые используются совместно потоками worker, а не копируются между ними. Когда условие передается от одного потока worker другому путем вызова метода setSharedProperty()
объекта Worker или с помощью объекта MessageChannel, оба потока worker располагают ссылками на один и тот же объект Condition в памяти среды выполнения.
Связанные элементы API
Свойство | Определено | ||
---|---|---|---|
constructor : Object
Ссылка на объект класса или функцию конструктора для данного экземпляра объекта. | Object | ||
isSupported : Boolean [статические] [только для чтения]
Указывает, поддерживается ли класс Condition текущей платформой. | Condition | ||
mutex : Mutex [только для чтения]
Взаимное исключение, связанное с данным условием. | Condition |
Метод | Определено | ||
---|---|---|---|
Создает новый экземпляр Condition. | Condition | ||
Показывает, определено ли заданное свойство для объекта. | Object | ||
Показывает, есть ли экземпляр класса Object в цепи прототипов объекта, заданного в качестве параметра. | Object | ||
Указывает, что условие, представляемое данным объектом Condition, удовлетворено и что право владения взаимным исключением будет возвращено следующему потоку worker, ожидающему выполнения этого условия (если такой имеется). | Condition | ||
Указывает, что условие, представляемое данным объектом Condition, удовлетворено и что право владения взаимным исключением будет возвращено всем потокам worker, ожидающим выполнения этого условия. | Condition | ||
Показывает наличие заданного свойства и его перечисляемость. | Object | ||
Задает доступность динамического свойства для операций цикла. | Object | ||
Возвращает строковое представление этого объекта, отформатированного в соответствии со стандартами, принятыми для данной локали. | Object | ||
Возвращает строковое представление заданного объекта. | Object | ||
Возвращает элементарное значение заданного объекта. | Object | ||
Указывает, что условие, представляемое данным объектом Condition, не удовлетворено, и текущий поток worker должен ждать, пока оно не будет удовлетворено, прежде чем сможет продолжить выполнение кода. | Condition |
isSupported | свойство |
isSupported:Boolean
[только для чтения] Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.5, AIR 3.5 |
Указывает, поддерживается ли класс Condition текущей платформой.
Примечание. Если класс Mutex не поддерживается, создать экземпляр Condition невозможно, это свойство имеет значение false
.
Реализация
public static function get isSupported():Boolean
mutex | свойство |
Condition | () | Конструктор |
notify | () | метод |
public function notify():void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.5, AIR 3.5 |
Указывает, что условие, представляемое данным объектом Condition, удовлетворено и что право владения взаимным исключением будет возвращено следующему потоку worker, ожидающему выполнения этого условия (если такой имеется).
Вызов этого метода не освобождает право владения взаимным исключением автоматически. После вызова notify()
необходимо явно освободить право владения взаимным исключением одним из двух способов: вызовите метод Mutex.unlock()
, если текущему потоку worker больше не потребуется взаимное исключение, или вызовите wait()
, если потоку worker снова потребуется право владения взаимным исключением после завершения работы других потоков worker.
Когда снимается блокировка с взаимного исключения, следующий поток worker в очереди потоков worker, вызвавших метод wait()
, получает взаимное исключение и возобновляет выполнение кода.
Выдает
IllegalOperationError — если текущий поток worker не владеет взаимным исключением данного условия
|
notifyAll | () | метод |
public function notifyAll():void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.5, AIR 3.5 |
Указывает, что условие, представляемое данным объектом Condition, удовлетворено и что право владения взаимным исключением будет возвращено всем потокам worker, ожидающим выполнения этого условия.
Вызов этого метода не освобождает право владения взаимным исключением автоматически. После вызова notify()
необходимо явно освободить право владения взаимным исключением одним из двух способов: вызовите метод Mutex.unlock()
, если текущему потоку worker больше не потребуется взаимное исключение, или вызовите wait()
, если потоку worker снова потребуется право владения взаимным исключением после завершения работы других потоков worker.
После снятия блокировки с взаимного исключения ожидающие потоки worker по очереди получат право владения в порядке вызова их метода wait()
. Каждый поток worker, вызвавший метод wait()
, получает взаимное исключение по очереди и возобновляет выполнение кода. Когда этот поток worker вызывает метод Mutex.unlock()
или wait()
, право владения взаимным исключением передается следующему ожидающему потоку worker. Каждый раз, когда право владения взаимным исключением передается от одного потока worker другому, передача осуществляется в рамках одной атомарной операции.
Выдает
IllegalOperationError — если текущий поток worker не владеет взаимным исключением данного условия
|
wait | () | метод |
public function wait(timeout:Number = -1):Boolean
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.5, AIR 3.5 |
Указывает, что условие, представляемое данным объектом Condition, не удовлетворено, и текущий поток worker должен ждать, пока оно не будет удовлетворено, прежде чем сможет продолжить выполнение кода. Вызов этого метода приостанавливает выполнение текущего потока worker и освобождает право владения взаимным исключением условия. Эти шаги выполняются как одна атомарная операция. Поток worker остается приостановленным, пока другой поток worker не вызовет метод notify()
или notifyAll()
этого объекта Condition.
Параметры
timeout:Number (default = -1 ) — максимальное время (в миллисекундах), на которое поток worker должен приостановить выполнение, прежде чем продолжить. Если это значение -1 (по умолчанию), тайм-аута нет и выполнение кода приостанавливается на неопределенное время.
|
Boolean — true , если метод возвращен в результате истечения времени тайм-аута. В противном случае, метод возвращает значение false .
|
Выдает
IllegalOperationError — если текущий поток worker не владеет взаимным исключением данного условия
| |
ArgumentError — если аргумент timeout меньше 0 и не равен -1
| |
ScriptTimeoutError — если метод вызван из кода первоначального потока worker в Flash Player и привел к приостановке выполнения на время, превышающее таймаут сценария (по умолчанию —15 секунд)
| |
Error — если вызван метод и, пока приостановлено выполнение вызвавшего его потока worker, выполнение ожидающего потока worker останавливается.
|
Tue Jun 12 2018, 11:34 AM Z