Вопрос

Я нахожусь в процессе преобразования нашего Java-кода для использования NIO, но не уверен, как лучше его спроектировать.

Мой первоначальный подход заключался в создании пула потоков селектора.Потоки запускаются/завершаются по мере необходимости, а каналы регистрируются в потоке выбора, когда они подключаются/принимаются циклическим способом.После этого каждый поток блокируется в select(), а при пробуждении запускает соответствующий обратный вызов, связанный с каждым каналом, имеющим выбранный ключ.

В дополнение к этой конструкции «множественного потока выбора», я также видел, как люди говорили, что нужно использовать один поток выбора и пул потоков диспетчеризации.Когда операция ввода-вывода готова к выполнению, селектор уведомляет поток диспетчера, который затем обрабатывает запрос.Преимущество этой модели заключается в том, что она не блокирует поток ввода-вывода, но теперь мы объединяем весь ввод-вывод в один поток и занимаемся синхронизацией/очередью событий в диспетчере.

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

Каков наилучший способ реализовать это?

Это было полезно?

Решение

Взгляните на Схема реактора

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

То, как вы хотите, чтобы ваши селекторы работали, действительно зависит от вашего варианта использования.(Количество соединений, размер сообщения и т. д.)

Какую проблему вы пытаетесь решить путем преобразования IO в NIO?

Другие советы

Тебе действительно стоит присмотреться к Мине,

http://mina.apache.org/

Это решает все проблемы, о которых вы упомянули.

Также взгляните на нетти который действительно быстрый и многофункциональный, а также используется в больших системах и таких крупных компаниях, как Redhat (jboss), Twitter, Facebook....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top