Чтение работает чтение из другого потока, вот очевидные проблемы с вашим кодом.
public void run() {
Set keysSet = selector.keys();
Здесь вы берете набор ключей из итератора, но в селекторе нет кода, выполняющего select () или selectNow (), поэтому этот набор всегда будет пустым.
Iterator i = keysSet.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
}
if (key.isReadable()) {
//read and do something
}
}
Это даже не компилируется, проверка «чтения» на ключе должна выполняться внутри блока while.
SelectionKey key = clientSocketChannel.register(selector,
SelectionKey.OP_READ |
SelectionKey.OP_WRITE);
Две проблемы: канал должен быть установлен в неблокирующем режиме, прежде чем это будет сделано, и SelectionKey.OP_WRITE не должен быть установлен, если вы не хотите, чтобы ключ возвращался каждый раз, когда вы запускаете выбор.
Вы должны установить SelectionKey.OP_WRITE, только если вы действительно планируете сделать запись.
Наконец, использование двух потоков здесь очень нетрадиционно. Рекомендуемый способ сделать это состоит в том, чтобы зарегистрировать ServerSocketChannel в селекторе с помощью OP_ACCEPT и выполнить команду accept для ServerSocket в том же потоке, что и чтение / запись.