With rnio you create an NioHandler and then you wait for events.
The events are read-ready, write-ready, accept-ready and
connect-ready. With rnio you only wait once, if you want to perform
the same action again you have to register for the event again.
You can set timeouts for each wait individually.

Internally rnio has a set of selectors and runs one thread for each
of them. Your event listeners can run either on the selector thread
or on a background from the thread pool, it is up to you to decide
what is better. For low latency you want to run on the selector
thread, but then you should not do any operation that might block,
since that will block rnio.