Spec-Zone.ru › OpenJDK 27

Класс SelectableChannel

java.lang.Object
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.SelectableChannel
Все реализуемые интерфейсы:
Closeable, AutoCloseable, Channel, InterruptibleChannel
Прямые известные подклассы:
AbstractSelectableChannel
public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Канал, который можно мультиплексировать с помощью Selector.

Чтобы использовать экземпляр этого класса с селектором, его сначала необходимо зарегистрировать с помощью метода register. Этот метод возвращает новый объект SelectionKey, представляющий регистрацию канала в селекторе.

После регистрации в селекторе канал остаётся зарегистрированным, пока его не отменят. Для этого освобождаются все ресурсы, выделенные селектором для канала.

Канал нельзя отменить напрямую; вместо этого необходимо отменить ключ, представляющий его регистрацию. Отмена ключа запрашивает отмену регистрации канала при следующей операции выбора селектора. Ключ можно отменить явным вызовом его метода cancel. Все ключи канала отменяются неявно при закрытии канала — как при вызове метода close, так и при прерывании потока, заблокированного на операции ввода-вывода с этим каналом.

Если закрыть сам селектор, канал будет отменён, а ключ, представляющий его регистрацию, станет недействительным без дополнительной задержки.

Канал можно зарегистрировать не более одного раза в каждом конкретном селекторе.

Определить, зарегистрирован ли канал в одном или нескольких селекторах, можно вызовом метода isRegistered.

Селектируемые каналы безопасны для использования несколькими параллельными потоками.

Режим блокировки

Селектируемый канал находится либо в блокирующем, либо в неблокирующем режиме. В блокирующем режиме каждая операция ввода-вывода, вызванная для канала, блокируется до завершения. В неблокирующем режиме операция ввода-вывода никогда не блокируется и может передать меньше байтов, чем запрошено, или вовсе не передать байтов. Определить режим блокировки селектируемого канала можно вызовом метода isBlocking.

Создаваемые селектируемые каналы всегда находятся в блокирующем режиме. Неблокирующий режим наиболее полезен в сочетании с мультиплексированием на основе селекторов. Перед регистрацией в селекторе канал необходимо перевести в неблокирующий режим; вернуть его в блокирующий режим можно только после отмены регистрации.

С момента версии:
1.4
См. также:
  • SelectionKey
  • Selector

Краткое описание конструкторов

SelectableChannel()
Модификатор Конструктор Описание
protected
Инициализирует новый экземпляр этого класса.

Краткое описание методов

Модификатор и тип Метод Описание
abstract Object blockingLock()
Возвращает объект, на котором синхронизируются методы configureBlocking и register.
abstract SelectableChannel configureBlocking(boolean block)
Настраивает режим блокировки этого канала.
abstract boolean isBlocking()
Показывает, блокируется ли каждая операция ввода-вывода на этом канале до её завершения.
abstract boolean isRegistered()
Показывает, зарегистрирован ли этот канал в данный момент в каком-либо селекторе.
abstract SelectionKey keyFor(Selector sel)
Возвращает ключ, представляющий регистрацию канала в указанном селекторе.
abstract SelectorProvider provider()
Возвращает поставщика, создавшего этот канал.
final SelectionKey register(Selector sel, int ops)
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора.
abstract SelectionKey register(Selector sel, int ops, Object att)
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора.
abstract int validOps()
Возвращает набор операций, указывающий операции, поддерживаемые этим каналом.

Методы, объявленные в классе AbstractInterruptibleChannel

begin, close, end, implCloseChannel, isOpen
Модификатор и тип Метод Описание
protected final void begin()
Отмечает начало операции ввода-вывода, которая может блокироваться на неопределённое время.
final void close()
Закрывает этот канал.
protected final void end(boolean completed)
Отмечает завершение операции ввода-вывода, которая может блокироваться на неопределённое время.
protected abstract void implCloseChannel()
Закрывает этот канал.
final boolean isOpen()
Показывает, открыт ли этот канал.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии.
Финализация устарела и может быть удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает значение хеш-кода этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или прерывания потока.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или прерывания потока, либо до истечения заданного интервала реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или прерывания потока, либо до истечения заданного интервала реального времени.

Подробное описание конструкторов

SelectableChannel

protected SelectableChannel()
Инициализирует новый экземпляр этого класса.

Подробное описание методов

provider

public abstract SelectorProvider provider()
Возвращает поставщика, создавшего этот канал.
Возвращает:
Поставщик, создавший этот канал

validOps

public abstract int validOps()
Возвращает набор операций, указывающий операции, поддерживаемые этим каналом. Установленные биты этого целочисленного значения точно обозначают операции, допустимые для данного канала. Для заданного конкретного класса канала этот метод всегда возвращает одно и то же значение.
Возвращает:
Набор допустимых операций

isRegistered

public abstract boolean isRegistered()
Показывает, зарегистрирован ли этот канал в данный момент в каком-либо селекторе. Созданный канал не зарегистрирован.

Из-за неизбежной задержки между отменой ключа и отменой регистрации канала он может оставаться зарегистрированным некоторое время после отмены всех его ключей. Канал также может оставаться зарегистрированным некоторое время после закрытия.

Возвращает:
true тогда и только тогда, когда этот канал зарегистрирован

keyFor

public abstract SelectionKey keyFor(Selector sel)
Возвращает ключ, представляющий регистрацию канала в указанном селекторе.
Параметры:
sel — селектор
Возвращает:
Ключ, возвращённый при последней регистрации этого канала в указанном селекторе, или null, если в данный момент этот канал не зарегистрирован в данном селекторе

register

public abstract SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора.

Если этот канал уже зарегистрирован в указанном селекторе, возвращается ключ выбора, представляющий эту регистрацию. Набор интересующих операций ключа будет изменён на ops, как если бы был вызван метод interestOps(int). Если аргумент att не равен null, то ему будет присвоено значение атрибута ключа. Если ключ уже был отменён, будет выброшено исключение CancelledKeyException.

В противном случае этот канал ещё не зарегистрирован в указанном селекторе, поэтому он регистрируется и возвращается созданный ключ. Исходный набор интересующих операций ключа будет равен ops, а его атрибут будет равен att.

Этот метод можно вызвать в любое время. Если он вызван во время выполнения операции выбора, это не повлияет на данную операцию; новая регистрация или изменение набора интересующих операций ключа будут учтены при следующей операции выбора. Если этот метод вызван во время выполнения вызова configureBlocking, он будет блокироваться, пока не будет настроен режим блокировки канала.

Если канал будет закрыт во время выполнения этой операции, возвращённый этим методом ключ будет отменён и, следовательно, станет недействительным.

Параметры:
sel — селектор, в котором регистрируется этот канал
ops — набор интересующих операций для создаваемого ключа
att — атрибут создаваемого ключа; может быть null
Возвращает:
Ключ, представляющий регистрацию этого канала в указанном селекторе
Выбрасывает:
ClosedChannelException — если канал закрыт
ClosedSelectorException — если селектор закрыт
IllegalBlockingModeException — если этот канал находится в блокирующем режиме
IllegalSelectorException — если этот канал создан не тем же поставщиком, что и указанный селектор
CancelledKeyException — если этот канал уже зарегистрирован в указанном селекторе, но соответствующий ключ уже отменён
IllegalArgumentException — если бит в наборе ops не соответствует операции, поддерживаемой этим каналом, то есть если set & ~validOps() != 0

register

public final SelectionKey register(Selector sel, int ops) throws ClosedChannelException
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора.

Вызов этого вспомогательного метода в форме

sc.register(sel, ops)
ведёт себя точно так же, как вызов
sc.register(sel, ops, null)
Параметры:
sel — селектор, в котором регистрируется этот канал
ops — набор интересующих операций для создаваемого ключа
Возвращает:
Ключ, представляющий регистрацию этого канала в указанном селекторе
Выбрасывает:
ClosedChannelException — если канал закрыт
ClosedSelectorException — если селектор закрыт
IllegalBlockingModeException — если этот канал находится в блокирующем режиме
IllegalSelectorException — если этот канал создан не тем же поставщиком, что и указанный селектор
CancelledKeyException — если этот канал уже зарегистрирован в указанном селекторе, но соответствующий ключ уже отменён
IllegalArgumentException — если бит в ops не соответствует операции, поддерживаемой этим каналом, то есть если set & ~validOps() != 0

configureBlocking

public abstract SelectableChannel configureBlocking(boolean block) throws IOException
Настраивает режим блокировки этого канала.

Если этот канал зарегистрирован в одном или нескольких селекторах, попытка перевести его в блокирующий режим приведёт к выбрасыванию исключения IllegalBlockingModeException.

Этот метод можно вызвать в любое время. Новый режим блокировки будет влиять только на операции ввода-вывода, начатые после возврата этого метода. Для некоторых реализаций может потребоваться ожидать завершения всех ожидающих операций ввода-вывода.

Если этот метод вызван во время выполнения другого вызова этого метода или метода register, он сначала будет блокироваться до завершения другой операции.

Параметры:
block — если true, этот канал будет переведён в блокирующий режим; если false, он будет переведён в неблокирующий режим
Возвращает:
Этот селектируемый канал
Выбрасывает:
ClosedChannelException — если канал закрыт
IllegalBlockingModeException — если block равно true и этот канал зарегистрирован в одном или нескольких селекторах
IOException — если произошла ошибка ввода-вывода

isBlocking

public abstract boolean isBlocking()
Показывает, блокируется ли каждая операция ввода-вывода на этом канале до её завершения. Созданный канал всегда находится в блокирующем режиме.

Если этот канал закрыт, возвращаемое этим методом значение не определено.

Возвращает:
true тогда и только тогда, когда этот канал находится в блокирующем режиме

blockingLock

public abstract Object blockingLock()
Возвращает объект, на котором синхронизируются методы configureBlocking и register. Это часто полезно при реализации адаптеров, которым требуется на короткое время поддерживать определённый режим блокировки.
Возвращает:
Объект блокировки режима блокировки

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, включая обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API