Блок Queue моделирует очередь агентов, ожидающих приема блоками, следующими за данным в потоковой диаграмме, или же хранилище агентов общего назначения. При необходимости вы можете задать максимальное время ожидания агента в очереди. Вы также можете программно извлекать агентов из любых позиций в очереди.
Поступающие агенты помещаются в очередь в определенном порядке: либо согласно правилу FIFO (First In, First Out, первый поступивший в очередь агент будет и извлекаться из очереди первым), LIFO (Last In, First Out, первым из очереди будет извлекаться последний поступивший в очередь агент), согласно приоритетам агентов, либо согласно сравнению агентов друг с другом. Приоритет может либо явно храниться в агенте, либо вычисляться согласно свойствам агента и каким-то внешним условиям. Очередь с приоритетами всегда примет нового входящего агента, вычислит его приоритет и поместит его в очередь в позицию, соответствующую его приоритету. Если очередь будет заполнена, то приход нового агента вынудит последнего хранящегося в очереди агента покинуть блок через порт outPreempted (но если приоритет нового агента не будет превышать приоритет последнего агента, то тогда вместо него будет вытеснена именно этот новый агент).
В режиме таймаута агент покинет очередь через порт outTimeout, если проведет в очереди заданное количество времени.
Вы можете извлекать любых агентов из очереди с помощью функции remove(). В некоторых случаях, например, когда блок Queue используется для моделирования хранилища с произвольным доступом, имеет смысл оставлять порт out несоединенным и извлекать агентов из очереди с помощью функции remove(). Извлеченные из очереди агенты могут быть вставлены в другие процессы с помощью блоков Enter.
Вы можете расширять функциональность блока Queue, выполняя необходимые вам действия в момент помещения агента в очередь, при достижении им начала очереди, а также при уходе агента из блока через любой из его портов. Пожалуйста, обратите внимание, что на момент вызова кода параметра onEnter агент уже будет помещен в очередь, а на момент вызова кода параметров onExit или onExitTimeout будет удален из очереди.
Вы можете динамически изменять вместимость очереди.
Агенты в очереди могут отображаться на презентации как стоящими один за другим (тип анимации Путь), так и стоящими в как-то по-другому заданных местах.
- Вместимость
- [Параметр виден, если не выбрана опция Максимальная вместимость]
Вместимость блока Queue.Синтаксис: int capacity
Значение по умолчанию: 100
Установить новое значение во время выполнения: set_capacity(новое значение) - Максимальная вместимость
- Если опция выбрана (true), то вместимость очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity
Значение по умолчанию: false
Установить новое значение во время выполнения: set_maximumCapacity(новое значение) - Место агентов
- Фигура разметки (узел или путь), где располагаются агенты, пока они обрабатываются блоком Delay.
Синтаксис: AnimationStaticLocationProvider entityLocation
- Очередь
- Политика, согласно которой агенты помещаются в очередь. Может быть:
FIFO — Выбранная по умолчанию политика. Первый добавленный в очередь агент будет и извлекаться из очереди первым (First In, First Out).
По приоритету — Агенты будут помещаться в очередь согласно их приоритетам (заданным в поле Приоритет агента).
Сравнение агентов — В этом режиме для каждого поступающего в очередь агента вычисляется булево выражение. Этот агент сравнивается с теми агентами, которые уже находятся в этой очереди, и место в очереди для этого агента определяется по результатам сравнения.
LIFO — Первым будет извлекаться последний добавленный в очередь агент (Last In, First Out).
Имя: queuing
Допустимые значения:Queue.QUEUING_FIFO — FIFO
Queue.QUEUING_PRIORITY — По приоритету
Queue.QUEUING_COMPARISON — Сравнение агентов
Queue.QUEUING_LIFO — LIFO - [Параметр виден, если Очередь: По приоритету]
Приоритет поступающего агента (чем больше тем выше).Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T agent — агент - [Параметр виден, если Очередь: Сравнение агентов]
Здесь вы можете указать булево выражение, которое вычисляется для каждого агента, поступающего в очередь. Выражение сравнивает этого агента с агентами, которые уже находятся в очереди и находит для него место согласно результату. Если выражение возвращает true, новый агент располагается ближе к началу очереди, чем агент из очереди, с которым его сравнивали.Тип значения: boolean
Локальные переменные:
T agent1 — агент
T agent2 — агент, который сравнивается с входящим агентом - Разрешить уход по таймауту
- Если опция выбрана (true), то агенты могут покидать очередь по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать блок через специальный порт outTimeout.
Синтаксис: boolean enableTimeout
Значение по умолчанию: true - [Параметр виден, если выбрана опция Разрешить уход по таймауту]
Выражение, вычисляющее значение таймаута (максимально допустимое время, которое агент может провести в очереди) для агента.Тип значения: double
Локальная переменная: T agent — агент - Разрешить вытеснение
- Если опция выбрана (true), то агенты помещаются в очередь в соответствии с их приоритетами и могут быть вытеснены из очереди агентами с более высокими приоритетами.
Синтаксис: boolean enablePreemption
Значение по умолчанию: false - Вернуть агента в исходную точку
- Если опция выбрана, агенты возвращаются в свое начальное местоположение (узел или путь, где они находились до того, как попали в этот блок), после того, как покинут фигуру разметки, заданную в параметре Место агентов.
Синтаксис: boolean restoreEntityLocationOnExit
- Включить сбор статистики
- Этот блок собирает статистику по длине очереди. Если сбор статистики глобально отключен для всех блоков Библиотеки моделирования процессов с помощью блока PML Settings, то эта опция позволяет переопределить эту настройку и включить сбор статистики для этого конкретного блока. Иначе статистика собирается вне зависимости от этой настройки.
Синтаксис: boolean forceStatisticsCollection
Значение по умолчанию: false
Во всех этих действиях актуальный агент доступен как локальная переменная agent.
- При входе
- Код, выполняемый, когда агент поступает в блок (и помещается в очередь).
- При подходе к выходу
- Код, выполняемый, когда агент достигает начала очереди (позиции с номером 0), что может случиться, как только агент входит в очередь.
- При выходе
- Код, выполняемый, когда агент покидает блок через порт out(обычным способом).
- При уходе по таймауту
- [Параметр виден, если выбрана опция Разрешить уход по таймауту]
Код, выполняемый, когда агент покидает блок по таймауту (прождав в очереди максимально допустимое время) через специальный порт outTimeout. - При вытеснении
- [Параметр виден, если выбрана опция Разрешить вытеснение]
Код, выполняемый, когда агент покидает блок через порт outPreemptedв результате вытеснения. - При извлечении
- Код, выполняемый, когда агент умышленно извлекается из блока посредством вызова функции агента remove(). Этот код вызывается автоматически после вызова функции remove().
Функция | Описание |
---|---|
int size() | Возвращает количество агентов, находящихся в данный момент в очереди. |
boolean canEnter() | Возвращает true, если в очередь может быть добавлен еще один агент. |
T get(int index) | Возвращает агента, находящегося в позиции с номером index (ближайшая к выходу из очереди позиция имеет номер 0). |
T getLast() | Возвращает последнего агента в очереди или null, если очередь пуста. |
T getFirst() | Возвращает первого агента в очереди или null, если очередь пуста. |
T removeFirst() | Извлекает первого агента (из позиции с номером 0) из очереди и возвращает его. |
T remove(Agent agent) | Извлекает агента agent из очереди и возвращает его. Если такого агента в очереди обнаружено не будет, функция вернет null. |
T remove(int index) | Извлекает агента из данной позиции в очереди и возвращает его. |
boolean release(T agent) | Сообщает очереди отпустить данного агента и направить его к выходному порту. При вызове этой функции, агент может покинуть блок Queue через выходной ’out’ порт, но он будет "входить" во вместимость очереди, пока его не выкинет из этого блока. Кроме того, если блок Queue имеет соответствующую конфигурацию, данный агент может быть вытеснен или может покинуть очередь по таймауту во время ожидания у порта ’out’. Код При подходе к выходу вызывается для данного агента. |
void sortAgents() | Перераспределяет агентов в очереди, сортируя их соответственно правилам очереди. Если очередь определяется способом FIFO или LIFO, то вызов этой функций не производит никаких действий. Если порядок поступления в очередь определяется По приоритету, то заново высчитываются приоритеты агентов. Если порядок поступления в очередь определяется как Сравнение агентов, то агенты сравниваются друг с другом. |
boolean isStatisticsCollected() | Возвращает true, если блок собирает статистику. |
void resetStats() | Удаляет статистику, собранную блоком к текущему моменту времени. |
Iterator<T> iterator() | Возвращает итератор агентов (в порядке: первый — у выхода, последний — самое большое время, оставшееся до его задержки). |
- StatisticsContinuous statsSize
- Непрерывная статистика длины очереди. Статистика собирается, если сбор статистики не выключен блоком PML Settings.
- in
- Входной порт.
- out
- Выходной порт.
- outTimeout
- Выходной порт для агентов, покидающих блок по таймауту (вследствие истечения заданного времени ожидания).
- outPreempted
- Выходной порт для агентов, покидающих блок в результате вытеснения.
-
Как мы можем улучшить эту статью?
-