Общая схема проблемы - ClientSocketChannel с многопоточным использованием CPU больше, чем ожидалось. Общее - это ClientSocketChannel с многопоточным процессом. ОК, я должен сказать, что вопрос, который я собираюсь задать, задается в this question.одновременное соединение с использованием Java NIO
Есть также другие сообщения с одинаковыми ответами. Причина, по которой я упоминал это снова, заключается в том, что я действительно не могу понять ответы, поскольку это не очевидно, и я не могу принять свой код с ними. Я попытаюсь вкратце объяснить требование, чтобы увидеть, есть ли ответ, который может удовлетворить все требования.
- Процесс записи должен вызывать с ByteBuffer которые заполняют в другом потоке
- Система должна сознавать либо писать или читать операции, как и любой из них может произойти в первую очередь.
- Способ предотвращения бесполезного запуска процессора, который кажется, что 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);
Использовать форматирование цитаты для цитируемого текста. – EJP