Класс 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
Подробное описание конструкторов
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/channels/SelectableChannel.html