Selector

Модуль 1. Java Syntax
26 уровень , 3 лекция
Открыта

В этой лекции мы познакомимся с селектором, представленным классом Selector. Класс находится в пакете java.nio.channels, поэтому для его использования не понадобится ничего скачивать или настраивать. Объект типа Selector может следить за одним или несколькими объектами типа Channel, проверять их готовность к чтению/записи и т. д. И главное: для selector нужен один поток, а не по одному потоку на каждый канал.

Создаем селектора с помощью статического метода open:


Selector selector = Selector.open();

После чего в объекте селектора можно регистрировать каналы:


SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

Второй параметр в метод register определяет, какую операцию будет мониторить селектор. Если нужно следить сразу за несколькими операциями, можно использовать побитовое ИЛИ:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

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

Здесь нужно сделать примечание: чтобы канал можно было использовать с селектором, он должен находиться в так называемом неблокирующем режиме:


channel1.configureBlocking(false);
channel2.configureBlocking(false);
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

Из этого следует, что селектор не будет работать с FileChannel, так как FileChannel нельзя переключить в неблокирующий режим (метод configureBlocking объявлен в классе SelectableChannel, а FileChannel его не наследует).

Из схемы ты можешь увидеть, что селекторы уместно использовать с сокетами. С ними мы поработаем в конце второго модуля.

SelectionKey

При регистрации канала с помощью селектора мы получаем объект SelectionKey. Этот объект содержит данные, представляющие регистрацию канала.

Из ключа можно определить, готов ли канал к определенному значению:


key.isReadable()
key.isAcceptable()
key.isConnectable()
key.isWritable()

Из ключа можно получить соответствующие канал и селектор:


Channel channel = key.channel();
Selector selector = key.selector();

К ключу можно прикрепить любой объект, чтобы в дальнейшем его отслеживать. Это можно сделать как во время регистрации канала (третьим аргументом), так и позже:

  1. SelectionKey key = channel.register(selector, SelectionKey.OP_ACCEPT, object);

  2. key.attach(object);

В дальнейшем из ключа можно получить прикрепленный объект:


Object object = key.attachment();

Заключение

После регистрации каналов с помощью селектора мы можем:

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

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

Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Владимир Кругман Уровень 51 Expert
1 августа 2023
Что это было? Такие бестолковые лекции как эта только понижают мотивацию изучать материал дальше
Акынбек Уровень 77 Expert
9 июня 2023
что я сейчас прочитал?
Виктор Уровень 37
3 октября 2022
"Вот воздух. Ним можно дышать. А ещё в нём летают ракеты. Но о них мы поговорим через полгода."
Pavel Petrov Уровень 109 Expert
17 мая 2022
ничего не понятно, но очень интересно
Андрей Пазюк Уровень 117 Expert
17 мая 2022
Pavel, голова горит после всех этих каналов и ключей.
jvatechs Уровень 111 Expert
3 января 2023
стало ли чуть понятнее на 74 уровне?
Андрей Пазюк Уровень 117 Expert
3 января 2023
Anar, если б не ты, я бы даже не вспомнил о том, что вообще это учил))
jvatechs Уровень 111 Expert
3 января 2023
ого, значит на правильном пути :3
Виктория Уровень 111
10 января 2023
Звучит обнадеживающе)
Максим Захаров Уровень 108 Expert
11 мая 2022
😐😐😐
Кирилл Уровень 45 Expert
17 апреля 2022
Владимир Уровень 109 Expert
9 апреля 2022
Олег Уровень 108 Expert
26 марта 2022
Sergey Drogunov Уровень 117 Expert
11 февраля 2022