Я нахожусь в процессе преобразования нашего Java-кода для использования NIO, но я не уверен в наилучшем способе его разработки.
Мой первоначальный подход заключался в создании пула потоков селектора. Потоки запускаются / уничтожаются по мере необходимости, и каналы регистрируются в потоке селектора, когда они подключены / приняты циклически. Оттуда каждый поток блокируется на select (), а при пробуждении запускает соответствующий обратный вызов, связанный с каждым каналом, у которого есть выбранный ключ.
В дополнение к этому дизайну «потока с несколькими селекторами», я также видел, как люди говорят, что используют один поток селектора и пул потоков диспетчеризации. Когда операция ввода-вывода готова к выполнению, селектор уведомляет поток диспетчера, который затем обрабатывает запрос. Преимущество этой модели состоит в том, что она не блокирует поток ввода-вывода, но теперь мы принудительно вводим все операции ввода-вывода в один поток и занимаемся синхронизацией / очередью событий в диспетчере.
Кроме того, я не смог бы использовать один прямой байтовый буфер для чтения каждого канала и передачи его непосредственно в обратный вызов. Вместо этого я должен был бы копировать данные каждый раз, когда чтение происходит в массив и сбрасывать. (Я думаю ..)
Какой лучший способ реализовать это?