Класс SelectableChannel
- Все реализуемые интерфейсы:
Closeable, AutoCloseable, Channel, InterruptibleChannel
- Прямые известные подклассы:
AbstractSelectableChannel
public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Selector. Чтобы использовать экземпляр этого класса с селектором, его сначала необходимо зарегистрировать с помощью метода register. Этот метод возвращает новый объект SelectionKey, представляющий регистрацию канала в селекторе.
После регистрации в селекторе канал остаётся зарегистрированным, пока его не отменят. Для этого освобождаются все ресурсы, выделенные селектором для канала.
Канал нельзя отменить напрямую; вместо этого необходимо отменить ключ, представляющий его регистрацию. Отмена ключа запрашивает отмену регистрации канала при следующей операции выбора селектора. Ключ можно отменить явным вызовом его метода cancel. Все ключи канала отменяются неявно при закрытии канала — как при вызове метода close, так и при прерывании потока, заблокированного на операции ввода-вывода с этим каналом.
Если закрыть сам селектор, канал будет отменён, а ключ, представляющий его регистрацию, станет недействительным без дополнительной задержки.
Канал можно зарегистрировать не более одного раза в каждом конкретном селекторе.
Определить, зарегистрирован ли канал в одном или нескольких селекторах, можно вызовом метода isRegistered.
Селектируемые каналы безопасны для использования несколькими параллельными потоками.
Режим блокировки
Селектируемый канал находится либо в блокирующем, либо в неблокирующем режиме. В блокирующем режиме каждая операция ввода-вывода, вызванная для канала, блокируется до завершения. В неблокирующем режиме операция ввода-вывода никогда не блокируется и может передать меньше байтов, чем запрошено, или вовсе не передать байтов. Определить режим блокировки селектируемого канала можно вызовом методаisBlocking. Создаваемые селектируемые каналы всегда находятся в блокирующем режиме. Неблокирующий режим наиболее полезен в сочетании с мультиплексированием на основе селекторов. Перед регистрацией в селекторе канал необходимо перевести в неблокирующий режим; вернуть его в блокирующий режим можно только после отмены регистрации.
- С момента версии:
- 1.4
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Object |
blockingLock() |
Возвращает объект, на котором синхронизируются методы configureBlocking и register. |
abstract SelectableChannel |
configureBlocking |
Настраивает режим блокировки этого канала. |
abstract boolean |
isBlocking() |
Показывает, блокируется ли каждая операция ввода-вывода на этом канале до её завершения. |
abstract boolean |
isRegistered() |
Показывает, зарегистрирован ли этот канал в данный момент в каком-либо селекторе. |
abstract SelectionKey |
keyFor |
Возвращает ключ, представляющий регистрацию канала в указанном селекторе. |
abstract SelectorProvider |
provider() |
Возвращает поставщика, создавшего этот канал. |
final SelectionKey |
register |
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора. |
abstract SelectionKey |
register |
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора. |
abstract int |
validOps() |
Возвращает набор операций, указывающий операции, поддерживаемые этим каналом. |
Методы, объявленные в классе AbstractInterruptibleChannel
begin, close, end, implCloseChannel, isOpen | Модификатор и тип | Метод | Описание |
|---|---|---|
protected final void |
begin() |
Отмечает начало операции ввода-вывода, которая может блокироваться на неопределённое время. |
final void |
close() |
Закрывает этот канал. |
protected final void |
end |
Отмечает завершение операции ввода-вывода, которая может блокироваться на неопределённое время. |
protected abstract void |
implCloseChannel() |
Закрывает этот канал. |
final boolean |
isOpen() |
Показывает, открыт ли этот канал. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
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 |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или прерывания потока, либо до истечения заданного интервала реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова 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. Это часто полезно при реализации адаптеров, которым требуется на короткое время поддерживать определённый режим блокировки.- Возвращает:
- Объект блокировки режима блокировки
© 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.