Выбор класса
- Все реализованные интерфейсы:
-
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, полученного из набора. Все ключи могут быть удалены из набора выбранных ключей, вызвав метод clear набора. Ключи не могут быть добавлены напрямую в набор выбранных ключей.
Выбор
Операция выбора запрашивает у базовой операционной системы обновление о готовности каждого зарегистрированного канала выполнить любую из операций, указанных в наборе интересов его ключа. Есть два типа операций выбора:
Методы
select(),select(long)иselectNow()добавляют ключи каналов, готовых выполнить операцию, в набор выбранных ключей или обновляют набор готовых операций ключей, уже находящихся в наборе выбранных ключей.Методы
select(Consumer),select(Consumer, long)иselectNow(Consumer)выполняют действие над ключом каждого канала, готового выполнить операцию. Эти методы не добавляют в набор выбранных ключей.
Операции выбора, которые добавляют в набор выбранных ключей
Во время каждой операции выбора ключи могут добавляться и удаляться из набора выбранных ключей селектора, и могут удаляться из наборов ключей и отменённых ключей. Выбор выполняется методами select(), select(long) и selectNow() и включает три шага:
Каждый ключ в наборе отменённых ключей удаляется из каждого набора ключей, членом которого он является, и его канал дерегистрируется. На этом шаге набор отменённых ключей становится пустым.
-
Базовая операционная система запрашивает обновление о готовности каждого оставшегося канала выполнить любую из операций, определённых набором интересов его ключа на момент начала операции выбора. Для канала, готового к по крайней мере одной такой операции, выполняется одно из двух действий:
Если ключ канала ещё не находится в наборе выбранных ключей, то он добавляется в этот набор, и его набор готовых операций изменяется так, чтобы указывать именно те операции, для которых канал сейчас готов. Любая информация о готовности, ранее записанная в наборе, отбрасывается.
В противном случае ключ канала уже находится в наборе выбранных ключей, поэтому его набор готовых операций изменяется, чтобы указать любые новые операции, для которых канал готов. Любая информация о готовности, ранее записанная в наборе, сохраняется; другими словами, набор готовности, возвращённый базовой системой, побитово объединяется с текущим набором готовности ключа.
Если какие-либо ключи были добавлены в набор отменённых ключей во время выполнения шага (2), то они обрабатываются так же, как и на шаге (1).
Различие между тремя методами выбора заключается только в том, блокируется ли операция выбора для ожидания готовности одного или нескольких каналов, и если да, то на какое время.
Операции выбора, выполняющие действие над выбранными ключами
Во время каждой операции выбора ключи могут удаляться из наборов ключей, выбранных ключей и отменённых ключей селектора. Выбор выполняется методами select(Consumer), select(Consumer,long) и selectNow(Consumer) и включает три шага:
Каждый ключ в наборе отменённых ключей удаляется из каждого набора ключей, членом которого он является, и его канал дерегистрируется. На этом шаге набор отменённых ключей становится пустым.
-
Базовая операционная система запрашивает обновление о готовности каждого оставшегося канала выполнить любую из операций, определённых набором интересов его ключа на момент начала операции выбора.
Для канала, готового к по крайней мере одной такой операции, набор готовых операций ключа канала устанавливается так, чтобы указывать именно те операции, для которых канал готов, и вызывается действие, заданное методу
select, для потребления ключа канала. Любая информация о готовности, ранее записанная в наборе, отбрасывается перед вызовом действия.В противном случае, когда канал готов к более чем одной операции, действие может быть вызвано более одного раза с ключом канала и набором готовых операций, изменённым на подмножество операций, для которых канал готов. Когда действие вызывается более одного раза для одного и того же ключа, его набор готовых операций никогда не содержит битов операций, которые были в наборе на предыдущих вызовах действия в той же операции выбора.
Если какие-либо ключи были добавлены в набор отменённых ключей во время выполнения шага (2), то они обрабатываются так же, как и на шаге (1).
Конкурентность
Селектор и его набор ключей безопасны для использования несколькими потоками. Однако его набор выбранных ключей и набор отменённых ключей не являются безопасными.
Операции выбора синхронизируются на самом селекторе, затем на наборе выбранных ключей. Они также синхронизируются на наборе отменённых ключей во время шагов (1) и (3) выше.
Изменения, внесённые в наборы интересов ключей селектора во время выполнения операции выбора, не влияют на эту операцию; они будут видны в следующей операции выбора.
Ключи могут быть отменены, и каналы могут быть закрыты в любое время. Следовательно, присутствие ключа в одном или нескольких наборах ключей селектора не подразумевает, что ключ действителен или что его канал открыт. Приложение должно быть осторожным в синхронизации и проверке этих условий при необходимости, если есть возможность того, что другой поток отменит ключ или закроет канал.
Поток, заблокированный в операции выбора, может быть прерван другим потоком тремя способами:
Вызовом метода селектора
wakeup,Вызовом метода селектора
close, илиВызовом метода заблокированного потока
interrupt, в этом случае его статус прерывания будет установлен, и будет вызван метод селектораwakeup.
Метод close синхронизируется на селекторе и его наборе выбранных ключей в том же порядке, что и в операции выбора.
Набор ключей селектора безопасен для использования несколькими потоками. Операции извлечения из набора ключей обычно не блокируют и поэтому могут перекрываться с новыми регистрациями, которые добавляются в набор, или с шагами отмены операций выбора, удаляющих ключи из набора. Итераторы и разделители возвращают элементы, отражающие состояние набора в какой-то момент времени до или после создания итератора/разделителя. Они не выбрасывают исключение ConcurrentModificationException.
Набор выбранных ключей селектора, как правило, не является безопасным для использования несколькими потоками. Если такой поток может напрямую изменить набор, то доступ должен контролироваться с помощью синхронизации на самом наборе. Итераторы, возвращаемые методами iterator набора, являются быстропроверки: Если набор изменяется после создания итератора любым способом, кроме вызова метода remove итератора, то будет выброшено исключение ConcurrentModificationException.
- Since:
- 1.4
- See Also:
Краткое описание конструкторов
| Modifier | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Modifier and Type | Метод | Описание |
|---|---|---|
abstract void |
close() |
Закрывает этот селектор. |
abstract boolean |
isOpen() |
Указывает, открыт ли этот селектор. |
abstract Set |
keys() |
Возвращает набор ключей этого селектора. |
static Selector |
open() |
Открывает селектор. |
abstract SelectorProvider |
provider() |
Возвращает поставщика, который создал этот канал. |
abstract int |
select() |
Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
abstract int |
select |
Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
int |
select |
Выбирает и выполняет действие над ключами, соответствующие каналы которых готовы к операциям ввода-вывода. |
int |
select |
Выбирает и выполняет действие над ключами, соответствующие каналы которых готовы к операциям ввода-вывода. |
abstract Set |
selectedKeys() |
Возвращает набор выбранных ключей этого селектора. |
abstract int |
selectNow() |
Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода-вывода. |
int |
selectNow |
Выбирает и выполняет действие над ключами, соответствующие каналы которых готовы к операциям ввода-вывода. |
abstract Selector |
wakeup() |
Принудительно заставляет первую операцию выбора, которая еще не вернулась, возвратиться немедленно. |
Подробное описание конструкторов
Конструктор
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- Если этот селектор закрыт
select
public int select(Consumer<SelectionKey> action, long timeout) throws IOException
Этот метод выполняет блокирующую операцию выбора. Он пробуждается от запроса к операционной системе только тогда, когда по крайней мере один канал выбран, метод wakeup этого селектора вызван, текущий поток прерван или истек заданный период ожидания, что произойдет первым.
Метод accept указанного действия вызывается с ключом для каждого канала, который готов выполнить операцию, определенную набором интересов ключа. Метод accept может быть вызван более одного раза для одного ключа, но с набором готовых операций, содержащим подмножество операций, для которых канал готов (как описано выше). Метод accept вызывается, синхронизированный на селекторе и его наборе выбранных ключей. Следует проявлять особую осторожность, чтобы избежать блокировки с другими потоками, которые также синхронизируются на этих объектах. Операции выбора, как правило, не рекурсивны, и, следовательно, действие должно проявлять особую осторожность, чтобы не пытаться выполнить операцию выбора на том же селекторе. Поведение при попытке рекурсивной операции выбора зависит от реализации и поэтому не определено. Если действие закрывает селектор, то ClosedSelectorException будет брошено при завершении действия. Действие не запрещено от закрытия каналов, зарегистрированных в селекторе, ни запрещено от отмены ключей или изменения набора интересов ключа. Если канал выбран, но его ключ отменен или его набор интересов изменен перед выполнением действия на ключе, то то, вызывается ли действие (может быть вызван с ключом invalid), зависит от реализации. Исключения, брошенные действием, передаются вызывающему объекту.
Этот метод не предлагает гарантий реального времени: он планирует таймаут как будто вызывая метод Object.wait(long).
- Требования к реализации:
- Стандартная реализация удаляет все ключи из набора выбранных ключей, вызывает
select(long)с заданным таймаутом, а затем выполняет действие для каждого ключа, добавленного в набор выбранных ключей. Стандартная реализация не обнаруживает, что действие выполняет рекурсивную операцию выбора. Набор выбранных ключей может быть или не быть пустым по завершении стандартной реализации. - Параметры:
-
action- Действие для выполнения -
timeout- Если положительное, блокировать доtimeoutмиллисекунд, приблизительно, ожидая, пока канал станет готовым; если ноль, блокировать неопределенно; не должно быть отрицательным - Возвращает:
- Количество уникальных ключей, обработанных, возможно ноль
- Имеет исключения:
-
IOException- Если произошла ошибка ввода-вывода -
ClosedSelectorException- Если этот селектор закрыт или закрыт действием -
IllegalArgumentException- Если значение аргумента таймаута отрицательное - С тех пор:
- 11
select
public int select(Consumer<SelectionKey> action) throws IOException
Этот метод выполняет блокирующую операцию выбора. Он пробуждается от запроса к операционной системе только тогда, когда по крайней мере один канал выбран, метод wakeup этого селектора вызван или текущий поток прерван, что произойдет первым.
Этот метод эквивалентен вызову метода 2-х аргументов select с таймаутом 0, чтобы блокировать неопределенно.
- Требования к реализации:
- Стандартная реализация вызывает метод 2-х аргументов
selectс таймаутом0. - Параметры:
-
action- Действие для выполнения - Возвращает:
- Количество уникальных ключей, обработанных, возможно ноль
- Имеет исключения:
-
IOException- Если произошла ошибка ввода-вывода -
ClosedSelectorException- Если этот селектор закрыт или закрыт действием - С тех пор:
- 11
selectNow
public int selectNow(Consumer<SelectionKey> action) throws IOException
Этот метод выполняет неблокирующую операцию выбора.
Вызов этого метода очищает эффект любых предыдущих вызовов метода wakeup.
- Требования к реализации:
- По умолчанию реализация удаляет все ключи из набора выбранных ключей, вызывает
selectNow(), а затем выполняет действие для каждого ключа, добавленного в набор выбранных ключей. По умолчанию реализация не обнаруживает выполнение действия, выполняющего рекурсивную операцию выбора. Набор выбранных ключей может быть или не быть пустым по завершении реализации по умолчанию. - Параметры:
-
action- Действие, которое нужно выполнить - Возвращает:
- Количество уникальных потреблённых ключей, возможно ноль
- Исключения:
-
IOException- Если произошла ошибка ввода-вывода -
ClosedSelectorException- Если селектор закрыт или закрыт действием - С:
- 11
wakeup
public abstract Selector wakeup()
Если другой поток в настоящее время заблокирован в операции выбора, этот вызов вернётся немедленно. Если ни одна операция выбора в данный момент не выполняется, следующий вызов операции выбора вернётся немедленно, если в это время не вызываются selectNow() или selectNow(Consumer). В любом случае возвращаемое значение этого вызова может быть отличным от нуля. Последующие операции выбора будут блокироваться как обычно, если этот метод не будет вызван в это время.
Вызов этого метода более одного раза между двумя последовательными операциями выбора имеет тот же эффект, что и вызов его только один раз.
- Возвращает:
- Этот селектор
close
public abstract void close() throws IOException
Если какой-либо поток в данный момент заблокирован в одном из методов выбора этого селектора, он прерывается так, как если бы был вызван метод селектора wakeup.
Любые неотменённые ключи, по-прежнему связанные с этим селектором, становятся недействительными, их каналы дерегистрируются, и любые другие ресурсы, связанные с этим селектором, высвобождаются.
Если этот селектор уже закрыт, вызов этого метода не оказывает никакого эффекта.
После закрытия селектора любая дальнейшая попытка его использовать, кроме как вызова этого метода или метода wakeup, приведёт к исключению ClosedSelectorException.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable - Исключения:
-
IOException- Если произошла ошибка ввода-вывода
© 1993, 2025, 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.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/nio/channels/Selector.html