2016-11-10 8 views
0

Общая схема проблемы - ClientSocketChannel с многопоточным использованием CPU больше, чем ожидалось. Общее - это ClientSocketChannel с многопоточным процессом. ОК, я должен сказать, что вопрос, который я собираюсь задать, задается в this question.одновременное соединение с использованием Java NIO

Есть также другие сообщения с одинаковыми ответами. Причина, по которой я упоминал это снова, заключается в том, что я действительно не могу понять ответы, поскольку это не очевидно, и я не могу принять свой код с ними. Я попытаюсь вкратце объяснить требование, чтобы увидеть, есть ли ответ, который может удовлетворить все требования.

  1. Процесс записи должен вызывать с ByteBuffer которые заполняют в другом потоке
  2. Система должна сознавать либо писать или читать операции, как и любой из них может произойти в первую очередь.
  3. Способ предотвращения бесполезного запуска процессора, который кажется, что OP_write делает его занятым, когда это не требуется.

ОТВЕТ:

Правильный способ использования OP_WRITE выглядит следующим образом:

Зарегистрировать недавно принятый канал OP_READ только

Так что нам нужно только один канал с OP_READ или оба (канал1 OP_READ, канал2 OP_READ | OP_WRITE)?

Если у вас есть что-то писать на канал, просто написать его

в какой части кода?

Если запись возвращает ноль, зарегистрировать канал OP_WRITE, сохранить ByteBuffer вы пытаетесь писать, и вернуться к избранной петле Когда OP_WRITE пожары на канале, вызов записи() с тем же буфером если эта запись преуспевает и не возвращает нуль, снова зарегистрируйте OP_READ или, по крайней мере, удалите OP_WRITE из interestOps.

«Если эта запись возвращает ноль», насколько я знаю, это означает, что байт не записывается, поэтому зачем мне регистрироваться на OP_WRITE?

«save byte buffer»: это правда, чтобы поместить этот буфер в качестве третьего аргумента в регистр? что-то вроде ниже?

channel.register(selector, operations, SharedBuffer); 
+0

Использовать форматирование цитаты для цитируемого текста. – EJP

ответ

1

Процесс записи должен вызывать с ByteBuffer которые заполняют в другом потоке

Почему? Другой поток может выполнять фактическую запись. Вам не нужно «запускать» что-либо.

Система должна осознавать операцию записи или чтения, поскольку любое из них может случиться в первую очередь.

Нет проблем.

Способ предотвращения бесполезного запуска процессора, который кажется, что OP_write делает его занятым, когда это не требуется.

Исправить. OP_WRITE почти всегда готов, поэтому используйте его, когда у вас нет ожидающих данных для записи , который уже провалился просто курит процессор.

Итак, нужен ли нам только один канал с операндом OP_READ или обоими (канал1 OP_READ, channel2 OP_READ | OP_WRITE)?

Вам нужен только один канал.

, в какой части кода?

В той части, которая знает, что ей есть что написать.

«Если что возвращает записи ноль», насколько мне известно, это означает, что ни один байт не писать,

Нет это не имеет. См. Javadoc. Это означает, что ничего не было написано. Если бы не было «байта для записи», вы бы не назвали write().

так зачем регистрироваться на OP_WRITE?

Значит, вы можете сказать, когда канал станет доступен для записи.

«save byte buffer»: верно ли, чтобы этот буфер был третьим аргументом регистра? что-то вроде ниже?

Да.

+0

благодарим за вашего пациента. Кажется, что, по крайней мере, в 3-й раз вы объясняете одно и то же. Я думаю о JAVA NIO без вас ... – APNezh

+0

На самом деле больше, чем на 3,00. – EJP

+0

Извините, что я прошу вас об этом, но поскольку в NIO есть какая-то темная часть, почему вы не пишете книгу по этой теме? Я лично прочитал 2 книги (конечно, не целую книгу, а относительную часть). но не они дали мне то, что они должны были дать. – APNezh

 Смежные вопросы

  • Нет связанных вопросов^_^