Осмысление неблокирующего ввода-вывода Java - PullRequest
2 голосов
/ 08 января 2012

Допустим, я запускаю сервер, и устанавливаю клиентские SocketChannels, которые я принимаю, как не блокирующие, и читаю их через потоки пула потоков.Но что это покупает меня?В любом случае мне нужно прочитать полный клиентский запрос перед его обработкой, а это значит, что мне нужно сделать несколько вызовов для чтения.

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

Так как же эффективен неблокирующий ввод-вывод?Как понять это все?Возможно, какой-нибудь многоядерный процессор?Но как?

РЕДАКТИРОВАТЬ: нашел довольно хорошую ссылку, которая объясняет это программно:

http://rox -xmlrpc.sourceforge.net / niotut /

Ответы [ 2 ]

3 голосов
/ 08 января 2012

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

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

2 голосов
/ 08 января 2012

Если вы не хотите использовать занятое ожидание (что звучит маловероятно), если вы хотите использовать неблокирование, вы обычно используете небольшое количество потоков (может быть только один) и селектор.

Если выбудет использовать блокировку ввода-вывода, то есть когда вы выделяете один или два потока на соединение.

...