Класс Selector
- java.lang.Object
-
- java.nio.channels.Selector
- Все реализуемые интерфейсы:
- Closeable, AutoCloseable
- Непосредственные известные подклассы:
- AbstractSelector
public abstract class Selector extends Object implements Closeable
Мультиплексор объектов SelectableChannel.
Селектор может быть создан путём вызова метода open этого класса, который будет использовать системный по умолчанию selector provider для создания нового селектора. Селектор также может быть создан путём вызова метода openSelector пользовательского поставщика селекторов. Селектор остаётся открытым до его закрытия посредством метода close.
Регистрация каналов выбора с селектором представлена объектом SelectionKey. Селектор поддерживает три набора ключей выбора:
Набор ключей содержит ключи, представляющие текущие регистрации каналов этого селектора. Этот набор возвращается методом
keys.Набор выбранных ключей — это набор ключей, для каналов каждого ключа было обнаружено, что они готовы хотя бы к одной из операций, определённых в наборе интересов ключа во время предыдущей операции выбора. Этот набор возвращается методом
selectedKeys. Набор выбранных ключей всегда является подмножеством набора ключей.Набор отменённых ключей — это набор ключей, которые были отменены, но каналы которых ещё не были дерегистрированы. Этот набор не доступен напрямую. Набор отменённых ключей всегда является подмножеством набора ключей.
Все три набора пусты в только что созданном селекторе.
Ключ добавляется в набор ключей селектора как побочный эффект регистрации канала через метод канала register. Отменённые ключи удаляются из набора ключей во время операций выбора. Сам набор ключей непосредственно не изменяем.
Ключ добавляется в набор отменённых ключей селектора, когда он отменяется, независимо от того, закрывается ли его канал или вызывается метод cancel. Отмена ключа приведёт к дерегистрации его канала во время следующей операции выбора, после чего ключ будет удалён из всех наборов ключей селектора.
Ключи добавляются в набор выбранных ключей операциями выбора. Ключ может быть удалён непосредственно из набора выбранных ключей путём вызова метода набора remove или путём вызова метода remove итератора iterator, полученного из набора. Ключи никогда не удаляются из набора выбранных ключей каким-либо другим способом; они не удаляются, в частности, как побочный эффект операций выбора. Ключи нельзя напрямую добавлять в набор выбранных ключей.
Выбор
Во время каждой операции выбора ключи могут добавляться и удаляться из набора выбранных ключей селектора и могут удаляться из его набора ключей и набора отменённых ключей. Выбор выполняется методами select(), select(long) и selectNow() и включает в себя три шага:
Каждый ключ в наборе отменённых ключей удаляется из каждого набора ключей, членом которого он является, и его канал дерегистрируется. Этот шаг оставляет набор отменённых ключей пустым.
-
Базовая операционная система запрашивается об обновлении готовности каждого оставшегося канала к выполнению любой из операций, указанных набором интересов его ключа, начиная с момента начала операции выбора. Для канала, готового хотя бы к одной такой операции, выполняется одно из следующих двух действий:
Если ключ канала ещё не находится в наборе выбранных ключей, то он добавляется в этот набор, и его набор готовых операций изменяется для указания именно тех операций, для которых канал сейчас готов. Любая информация о готовности, ранее записанная в наборе, отбрасывается.
В противном случае ключ канала уже находится в наборе выбранных ключей, поэтому его набор готовых операций изменяется для указания любых новых операций, для которых канал готов. Любая информация о готовности, ранее записанная в наборе, сохраняется; другими словами, набор готовности, возвращаемый базовой системой, побитово дизъюнктивно объединяется с текущим набором готовности ключа.
Если в набор отменённых ключей были добавлены какие-либо ключи во время выполнения шага (2), то они обрабатываются, как в шаге (1).
Единственное существенное различие между тремя методами выбора заключается в том, блокируется ли операция выбора для ожидания готовности одного или нескольких каналов, и если да, то на какое время.
Конкурентность
Селекторы сами по себе безопасны для использования несколькими потоками; однако их наборы ключей — нет.
Операции выбора синхронизируются на самом селекторе, на наборе ключей и на наборе выбранных ключей в указанном порядке. Они также синхронизируются на наборе отменённых ключей во время шагов (1) и (3) выше.
Изменения, внесённые в наборы интересов ключей селектора во время выполнения операции выбора, не влияют на эту операцию; они будут замечены следующей операцией выбора.
Ключи могут быть отменены, и каналы могут быть закрыты в любое время. Следовательно, присутствие ключа в одном или нескольких наборах ключей селектора не подразумевает, что ключ действителен или что его канал открыт. Приложение должно быть внимательным к синхронизации и проверке этих условий, если есть вероятность, что другой поток отменит ключ или закроет канал.
Поток, заблокированный в одном из методов select() или select(long), может быть прерван другим потоком тремя способами:
Путем вызова метода
wakeupселектора,Путем вызова метода
closeселектора, илиПутем вызова метода
interruptзаблокированного потока, в этом случае статус прерывания будет установлен, и вызывается метод селектораwakeup.
Метод close синхронизируется на селекторе и на всех трёх наборах ключей в том же порядке, что и при выполнении операции выбора.
Наборы ключей и выбранных ключей селектора, как правило, не безопасны для одновременного использования несколькими потоками. Если такой поток может непосредственно изменить один из этих наборов, то доступ должен контролироваться синхронизацией на самом наборе. Итераторы, возвращаемые методами iterator этих наборов, являются быстро меняющимися: если набор изменяется после создания итератора каким-либо способом, кроме вызова метода remove самого итератора, то будет брошено исключение ConcurrentModificationException.
- С момента:
- 1.4
- См. также:
-
SelectableChannel,SelectionKey
Конструкторы
| Модификатор | Конструктор и описание |
|---|---|
protected |
Selector() Инициализирует новый экземпляр этого класса. |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
abstract void |
close() Закрывает этот селектор. |
abstract boolean |
isOpen() Определяет, открыт ли этот селектор. |
abstract Set<SelectionKey> |
keys() Возвращает набор ключей этого селектора. |
static Selector |
open() Открывает селектор. |
abstract SelectorProvider |
provider() Возвращает поставщика, который создал этот канал. |
abstract int |
select() Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
abstract int |
select(long timeout) Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
abstract Set<SelectionKey> |
selectedKeys() Возвращает набор выбранных ключей этого селектора. |
abstract int |
selectNow() Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
abstract Selector |
wakeup() Принуждает первую операцию выбора, которая ещё не возвращала результат, к возврату немедленно. |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
Selector
protected Selector()
Инициализирует новый экземпляр этого класса.
Методы
open
public static Selector open()
throws IOException Открывает селектор.
Новый селектор создается путем вызова метода openSelector системного объекта по умолчанию SelectorProvider.
- Возвращает:
- Новый селектор
- Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода
isOpen
public abstract boolean isOpen()
Указывает, открыт ли этот селектор.
- Возвращает:
-
trueесли и только если этот селектор открыт
provider
public abstract SelectorProvider provider()
Возвращает поставщика, который создал этот канал.
- Возвращает:
- Поставщик, который создал этот канал
keys
public abstract Set<SelectionKey> keys()
Возвращает набор ключей этого селектора.
Набор ключей не может быть непосредственно изменен. Ключ удаляется только после его отмены и дерегистрации его канала. Любая попытка изменить набор ключей приведет к выбрасыванию исключения UnsupportedOperationException.
Набор ключей не потокобезопасен.
- Возвращает:
- Набор ключей этого селектора
- Выбрасывает:
-
ClosedSelectorException- Если этот селектор закрыт
selectedKeys
public abstract Set<SelectionKey> selectedKeys()
Возвращает набор выбранных ключей этого селектора.
Ключи могут быть удалены, но не могут быть непосредственно добавлены в набор выбранных ключей. Любая попытка добавить объект в набор ключей приведет к выбрасыванию исключения UnsupportedOperationException.
Набор выбранных ключей не потокобезопасен.
- Возвращает:
- Набор выбранных ключей этого селектора
- Выбрасывает:
-
ClosedSelectorException- Если этот селектор закрыт
selectNow
public abstract int selectNow()
throws IOException Выбирает набор ключей, соответствующие каналы которых готовы для операций ввода-вывода.
Этот метод выполняет неблокирующую операцию выбора. Если ни один канал не стал выбираемым с момента предыдущей операции выбора, то этот метод немедленно возвращает ноль.
Вызов этого метода очищает эффект любых предыдущих вызовов метода wakeup.
- Возвращает:
- Количество ключей, возможно ноль, наборы готовых операций которых были обновлены операцией выбора
- Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода -
ClosedSelectorException- Если этот селектор закрыт
select
public abstract int select(long timeout)
throws IOException Выбирает набор ключей, соответствующие каналы которых готовы для операций ввода-вывода.
Этот метод выполняет блокирующую операцию выбора. Он возвращается только после того, как хотя бы один канал будет выбран, метод wakeup этого селектора будет вызван, текущий поток будет прерван или истечет заданный период ожидания, что произойдет раньше.
Этот метод не гарантирует реального времени: он планирует таймаут так, как будто вызывается метод Object.wait(long).
- Параметры:
-
timeout- Если положительное, блокировать доtimeoutмиллисекунд, приблизительно, ожидая, пока канал не станет готовым; если ноль, блокировать неопределенно; не должно быть отрицательным - Возвращает:
- Количество ключей, возможно ноль, наборы готовых операций которых были обновлены
- Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода -
ClosedSelectorException- Если этот селектор закрыт -
IllegalArgumentException- Если значение аргумента таймаута отрицательное
select
public abstract int select()
throws IOException Выбирает набор ключей, соответствующие каналы которых готовы для операций ввода-вывода.
Этот метод выполняет блокирующую операцию выбора. Он возвращается только после того, как хотя бы один канал будет выбран, метод wakeup этого селектора будет вызван или текущий поток будет прерван, что произойдет раньше.
- Возвращает:
- Количество ключей, возможно ноль, наборы готовых операций которых были обновлены
- Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода -
ClosedSelectorException- Если этот селектор закрыт
wakeup
public abstract Selector wakeup()
Принудительно возвращает первую операцию выбора, которая еще не вернулась.
Если другой поток в настоящее время заблокирован в вызове методов select() или select(long), то этот вызов вернется немедленно. Если в настоящее время ни одна операция выбора не выполняется, то следующий вызов одного из этих методов вернется немедленно, если в это время не вызывается метод selectNow(). В любом случае значение, возвращаемое этим вызовом, может быть отличным от нуля. Последующие вызовы методов select() или select(long) будут блокироваться как обычно, если этот метод не будет вызван снова в это время.
Вызов этого метода более одного раза между двумя последовательными операциями выбора имеет тот же эффект, что и вызов его только один раз.
- Возвращает:
- Этот селектор
close
public abstract void close()
throws IOException Закрывает этот селектор.
Если поток в настоящее время заблокирован в одном из методов выбора этого селектора, он прерывается так, как если бы вызывался метод wakeup селектора.
Любые неотмененные ключи, все еще связанные с этим селектором, делают недействительными, их каналы дерегистрируются, и все другие ресурсы, связанные с этим селектором, освобождаются.
Если этот селектор уже закрыт, вызов этого метода не оказывает никакого эффекта.
После закрытия селектора любая дальнейшая попытка использовать его, за исключением вызова этого метода или метода wakeup, приведет к выбрасыванию исключения ClosedSelectorException.
- Определено в:
-
closeв интерфейсеCloseable - Определено в:
-
closeв интерфейсеAutoCloseable - Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.