socketChannel.configureBlocking(false);
That would be the problem, wouldn't it?
I would be surprised...
Selector.select() *does* block, indefinitely, according to the NIO specification.
From the API docs, a READ selector ought to block until one of it's channels has received incoming data which your code has not yet read out, OR until any of its channels has been disconnected (not in the docs

).
There are other alternatives, but these are all official bugs with e.g. 1.4.0 and 1.4.1 on specific platforms, and have IIRC all been fixed.