Лучшая модель для реализации NIO? - PullRequest
6 голосов
/ 21 сентября 2009

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 21 сентября 2009

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

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

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

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

3 голосов
/ 21 сентября 2009

Я нашел ROX Java NIO Tutorial , полезный для начала работы с NIO.

Grizzly - это еще одна инфраструктура NIO (похожая на MINA).

3 голосов
/ 21 сентября 2009

Тебе действительно стоит заглянуть в Мину,

http://mina.apache.org/

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

1 голос
/ 21 февраля 2012

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

...