Мне трудно понять это. У меня есть следующий код:
if (selector.select(1000) <= 0) {
return;
}
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey key : selectionKeys) {
try {
SocketEventHandler handler = (SocketEventHandler) key.attachment();
if (key.isValid() && key.isAcceptable()) {
handler.becomesAcceptable(key);
}
if (key.isValid() && key.isReadable()) {
handler.becomesReadable(key);
}
if (key.isValid() && key.isWritable()) {
handler.becomesWritable(key);
}
if (key.isValid() && key.isConnectable()) {
handler.becomesConnectable(key);
}
} catch (IOException e) {
key.cancel();
}
}
selector.selectedKeys().clear();
Со следующим кодом обработчика для чтения:
synchronized public void becomesReadable(SelectionKey key) throws IOException {
ByteBuffer temporaryBuffer = ByteBuffer.allocate(DEFAULT_BYTE_BUFFER_SIZE);
temporaryBuffer.position(0);
int read = -1;
try {
read = channel.read(temporaryBuffer);
} catch (IOException e) {
prefixLogger.debug("Trace:", e);
close();
}
...
}
И это единственная точка, где когда-либо вызывается функция обработчика. Так что, если я когда-нибудь попаду в функцию becomeReadable()
, канал будет в читаемом состоянии, но при этом вызов read()
блоков не вернется. Я что-то пропустил?