Selector Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Мультиплексор SelectableChannel
объектов.
[Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)]
public abstract class Selector : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ICloseable
[<Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)>]
type Selector = class
inherit Object
interface ICloseable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Наследование
- Производный
- Атрибуты
- Реализации
Комментарии
Мультиплексор SelectableChannel
объектов.
Селектор может быть создан путем вызова #open open
метода этого класса, который будет использовать систему по умолчанию java.nio.channels.spi.SelectorProvider selector provider
для создания нового селектора. Селектор также может быть создан путем вызова java.nio.channels.spi.SelectorProvider#openSelector openSelector
метода пользовательского поставщика селектора. Селектор остается открытым, пока он не будет закрыт через его #close close
метод.
"ks">
Регистрация выбранного канала с помощью селектора представлена SelectionKey
объектом. Селектор поддерживает три набора ключей выбора:
<ul>
<Литий>
Набор ключей содержит ключи, представляющие текущие регистрации каналов этого селектора. Этот набор возвращается методом #keys() keys
.
</Литий>
<Литий>
Выбранный набор ключей — это набор ключей, так что канал каждого ключа был обнаружен готовым по крайней мере к одной из операций, определенных в интересе ключа во время предыдущей операции выбора, которая добавляет ключи или обновления ключей в набор. Этот набор возвращается методом #selectedKeys() selectedKeys
. Выбранный набор ключей всегда является подмножеством набора ключей.
</Литий>
<Литий>
Набор отмененных ключей — это набор ключей, которые были отменены, но каналы которых еще не зарегистрированы. Этот набор недоступен напрямую. Набор отмененных ключей всегда является подмножеством набора ключей.
</Литий>
</ul>
Все три набора пусты в созданном селекторе.
Ключ добавляется в набор ключей селектора в качестве побочных эффектов регистрации канала с помощью метода канала SelectableChannel#register(Selector,int) register
. Отмененные ключи удаляются из набора ключей во время операций выбора. Сам набор ключей не является напрямую изменяемым.
Ключ добавляется в набор отмененных ключей селектора при отмене, закрыв канал или вызывая его SelectionKey#cancel cancel
метод. Отмена ключа приведет к отмене регистрации канала во время следующей операции выбора, когда ключ будет удален из всех наборов ключей селектора.
"sks">
Ключи добавляются в выбранный набор ключей операциями выбора. Ключ может быть удален непосредственно из набора выбранных ключей путем вызова метода набора java.util.Set#remove(java.lang.Object) remove
или вызова java.util.Iterator#remove() remove
метода, полученного java.util.Iterator iterator
из набора. Все ключи могут быть удалены из набора выбранных ключей путем вызова метода набора java.util.Set#clear() clear
. Ключи могут не добавляться непосредственно в выбранный набор ключей.
"selop"><h2 Selection</h2>>
Операция выбора запрашивает базовую операционную систему для обновления в отношении готовности каждого зарегистрированного канала выполнить любую из операций, определенных интересующим его ключом. Существует две формы операции выбора:
<Пр>
<Литий>
#select(long)
Методы #select()
и #selectNow()
методы добавляют ключи каналов, готовые к выполнению операции в набор выбранных ключей, или обновите готовый набор ключей, уже в выбранном наборе ключей.
</Литий>
<Литий>
#select(Consumer, long)
Методы #select(Consumer)
и #selectNow(Consumer)
методы выполняют действие с ключом каждого канала, готового к выполнению операции. Эти методы не добавляются в набор выбранных ключей.
</Литий>
</Пр>
<Операции выбора h3>, которые добавляются в набор< выбранных ключей/h3>
Во время каждой операции выбора ключи могут быть добавлены и удалены из выбранного набора ключей селектора и могут быть удалены из его ключа и отмененных наборов ключей. Выбор выполняется методами #select()
и #select(long)
#selectNow()
методами, а также включает три этапа:
<Пр>
<Литий>
Каждый ключ в наборе отмененных ключей удаляется из каждого набора ключей, из которого он является членом, и его канал удаляется. Этот шаг оставляет отмененный набор ключей пустым.
</Литий>
<Литий>
Базовая операционная система запрашивает обновление по готовности каждого оставшегося канала выполнять любую из операций, определенных интересующим его ключом, как по состоянию на момент начала операции выбора. Для канала, готового по крайней мере к одной такой операции, выполняется одно из следующих двух действий:
<Пр>
<Литий>
Если ключ канала еще не находится в выбранном наборе ключей, он добавляется в этот набор, а его набор готовых операций изменяется, чтобы определить именно те операции, для которых канал теперь будет готов. Все сведения о готовности, записанные ранее в готовом наборе, удаляются.
</Литий>
<Литий>
В противном случае ключ канала уже находится в выбранном наборе ключей, поэтому его готовый набор операций изменяется, чтобы определить все новые операции, для которых канал будет готов. Все сведения о готовности, записанные ранее в готовом наборе, сохраняются; Другими словами, готовый набор, возвращаемый базовой системой, побитово разъединен в текущий готовый набор ключа.
</Литий>
</Пр>
Если все ключи в наборе ключей в начале этого шага имеют пустые наборы интересов, то ни выбранный набор ключей, ни все наборы готовых операций ключей не будут обновлены.
<Литий>
Если все ключи были добавлены в набор отмененных ключей во время выполнения шага (2), они обрабатываются как на шаге (1).
</Литий>
</Пр>
Независимо от того, будут ли блоки операций выбора ожидать готовности одного или нескольких каналов, и если да, то как долго, это единственное важное различие между тремя методами выбора.
<Операции выбора h3>, выполняющие действие с выбранными ключами</h3>
Во время каждой операции выбора ключи могут быть удалены из ключа селектора, выбранного ключа и отмененных наборов ключей. Выбор выполняется методами #select(Consumer)
и #select(Consumer,long)
#selectNow(Consumer)
методами, а также включает три этапа:
<Пр>
<Литий>
Каждый ключ в наборе отмененных ключей удаляется из каждого набора ключей, из которого он является членом, и его канал удаляется. Этот шаг оставляет отмененный набор ключей пустым.
</Литий>
<Литий>
Базовая операционная система запрашивает обновление по готовности каждого оставшегося канала выполнять любую из операций, определенных интересующим его ключом, как по состоянию на момент начала операции выбора.
Для канала, готового по крайней мере к одной такой операции, набор готовых операций ключа канала определяет именно те операции, для которых канал готов, и действие , указанное select
методу, вызывается для использования ключа канала. Все сведения о готовности, записанные ранее в готовом наборе, удаляются до вызова действия.
Кроме того, если канал готов к выполнению нескольких операций, действие может вызываться несколько раз с ключом канала и набором готовых операций, измененных в подмножество операций, для которых канал готов. Если действие вызывается несколько раз для того же ключа, то его набор готовых операций никогда не содержит биты операций, содержащиеся в наборе при предыдущих вызовах действия в той же операции выбора.
</Литий>
<Литий>
Если все ключи были добавлены в набор отмененных ключей во время выполнения шага (2), они обрабатываются как на шаге (1).
</Литий>
</Пр>
<h2>Concurrency</h2>
Селектор и его набор ключей безопасны для использования несколькими параллельными потоками. Его выбранный набор ключей и отмененный набор ключей, однако, не являются.
Операции выбора синхронизируются с селектором в выбранном наборе ключей в этом порядке. Они также синхронизируются с набором отмененных ключей во время шагов (1) и (3) выше.
Изменения, внесенные в интересующие наборы ключей селектора во время выполнения операции выбора, не влияют на операцию. Они будут замечены следующей операцией выбора.
Ключи могут быть отменены, и каналы могут быть закрыты в любое время. Поэтому наличие ключа в одном или нескольких наборах ключей селектора не означает, что ключ действителен или открыт его канал. Код приложения должен быть осторожным для синхронизации и проверки этих условий, если существует любая вероятность того, что другой поток отменит ключ или закройте канал.
Поток, заблокированный в операции выбора, может быть прерван другим потоком одним из трех способов:
<ul>
<Литий>
Вызывая метод селектора #wakeup wakeup
,
</Литий>
<Литий>
Вызов метода селектора #close close
или
</Литий>
<Литий>
Вызывая метод заблокированного java.lang.Thread#interrupt() interrupt
потока, в этом случае его состояние прерывания будет задано, а метод селектора #wakeup wakeup
будет вызван.
</Литий>
</ul>
Метод #close close
синхронизируется с селектором и выбранным ключом в том же порядке, что и в операции выбора.
"ksc">
Набор ключей селектора является безопасным для использования несколькими параллельными потоками. Операции извлечения из набора ключей обычно не блокируются и поэтому могут перекрываться новыми регистрациями, добавляющими в набор, или с этапами отмены операций выбора, которые удаляют ключи из набора. Итераторы и разделители возвращают элементы, отражающие состояние набора в какой-то момент или после создания итератора или разбителя. Они не бросают java.util.ConcurrentModificationException ConcurrentModificationException
.
"sksc">
Выбранный набор ключей селектора не является безопасным для использования несколькими параллельными потоками. Если такой поток может изменить набор непосредственно, то доступ должен управляться синхронизацией в самом наборе. Итераторы, возвращаемые методами набора java.util.Set#iterator() iterator
, завершаются сбоем: если набор изменяется после создания итератора, в любом случае, за исключением вызова собственного java.util.Iterator#remove() remove
метода итератора, java.util.ConcurrentModificationException
создается исключение.
Добавлено в версии 1.4.
Документация по Java для java.nio.channels.Selector
.
Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.
Конструкторы
Selector() |
Инициализирует новый экземпляр этого класса. |
Selector(IntPtr, JniHandleOwnership) |
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения. |
Свойства
Class |
Возвращает класс среды выполнения этого |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
IsOpen |
Указывает, открыт ли этот селектор. |
JniIdentityHashCode |
Мультиплексор |
JniPeerMembers |
Мультиплексор |
PeerReference |
Мультиплексор |
ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
Методы
Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
Close() |
Закрывает этот селектор. |
Dispose() |
Мультиплексор |
Dispose(Boolean) |
Мультиплексор |
Equals(Object) |
Указывает, равен ли другой объект этому объекту. (Унаследовано от Object) |
GetHashCode() |
Возвращает значение хэш-кода для объекта. (Унаследовано от Object) |
JavaFinalize() |
Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет. (Унаследовано от Object) |
Keys() |
Возвращает набор ключей этого селектора. |
Notify() |
Пробуждение одного потока, ожидающего монитора этого объекта. (Унаследовано от Object) |
NotifyAll() |
Просыпает все потоки, ожидающие монитора этого объекта. (Унаследовано от Object) |
Open() |
Открывает селектор. |
Provider() |
Возвращает поставщика, создавшего этот канал. |
Select() |
Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
Select(IConsumer, Int64) |
Выбирает и выполняет действие на ключах, соответствующие каналы которых готовы к операциям ввода-вывода. |
Select(IConsumer) |
Выбирает и выполняет действие на ключах, соответствующие каналы которых готовы к операциям ввода-вывода. |
Select(Int64) |
Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
SelectedKeys() |
Возвращает выбранный набор ключей этого селектора. |
SelectNow() |
Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
SelectNow(IConsumer) |
Выбирает и выполняет действие на ключах, соответствующие каналы которых готовы к операциям ввода-вывода. |
SetHandle(IntPtr, JniHandleOwnership) |
Задает свойство Handle. (Унаследовано от Object) |
ToArray<T>() |
Мультиплексор |
ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
UnregisterFromRuntime() |
Мультиплексор |
Wait() |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>помощи уведомления</em> или <эм>прерванного</em>. (Унаследовано от Object) |
Wait(Int64, Int32) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Wait(Int64) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Wakeup() |
Вызывает первую операцию выбора, которая еще не вернулась к возврату немедленно. |
Явные реализации интерфейса
IJavaPeerable.Disposed() |
Мультиплексор |
IJavaPeerable.DisposeUnlessReferenced() |
Мультиплексор |
IJavaPeerable.Finalized() |
Мультиплексор |
IJavaPeerable.JniManagedPeerState |
Мультиплексор |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Мультиплексор |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Мультиплексор |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Мультиплексор |
Методы расширения
JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
JavaCast<TResult>(IJavaObject) |
Мультиплексор |
GetJniTypeName(IJavaPeerable) |
Мультиплексор |