Вопрос
Я нахожусь в процессе преобразования нашего Java-кода для использования NIO, но не уверен, как лучше его спроектировать.
Мой первоначальный подход заключался в создании пула потоков селектора.Потоки запускаются/завершаются по мере необходимости, а каналы регистрируются в потоке выбора, когда они подключаются/принимаются циклическим способом.После этого каждый поток блокируется в select(), а при пробуждении запускает соответствующий обратный вызов, связанный с каждым каналом, имеющим выбранный ключ.
В дополнение к этой конструкции «множественного потока выбора», я также видел, как люди говорили, что нужно использовать один поток выбора и пул потоков диспетчеризации.Когда операция ввода-вывода готова к выполнению, селектор уведомляет поток диспетчера, который затем обрабатывает запрос.Преимущество этой модели заключается в том, что она не блокирует поток ввода-вывода, но теперь мы объединяем весь ввод-вывод в один поток и занимаемся синхронизацией/очередью событий в диспетчере.
Кроме того, я не смог бы использовать один прямой байтовый буфер для чтения каждого канала, передавая его непосредственно в обратный вызов.Вместо этого мне пришлось бы копировать данные каждый раз, когда происходит чтение в массив, и сбрасывать их.(Я думаю..)
Каков наилучший способ реализовать это?
Решение
Взгляните на Схема реактора
http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
То, как вы хотите, чтобы ваши селекторы работали, действительно зависит от вашего варианта использования.(Количество соединений, размер сообщения и т. д.)
Какую проблему вы пытаетесь решить путем преобразования IO в NIO?
Другие советы
Тебе действительно стоит присмотреться к Мине,
Это решает все проблемы, о которых вы упомянули.
Также взгляните на нетти который действительно быстрый и многофункциональный, а также используется в больших системах и таких крупных компаниях, как Redhat (jboss), Twitter, Facebook....