### Question:
NioEventLoop extends SingleThreadEventLoop { public void register(final SelectableChannel ch, final int interestOps, final NioTask<?> task) { if (ch == null) { throw new NullPointerException("ch"); } if (interestOps == 0) { throw new IllegalArgumentException("interestOps must be non-zero."); } if ((interestOps & ~ch.validOps()) != 0) { throw new IllegalArgumentException( "invalid interestOps: " + interestOps + "(validOps: " + ch.validOps() + ')'); } if (task == null) { throw new NullPointerException("task"); } if (isShutdown()) { throw new IllegalStateException("event loop shut down"); } try { ch.register(unwrappedSelector, interestOps, task); } catch (Exception e) { throw new EventLoopException("failed to register a channel", e); } } NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,
                 SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler); SelectorProvider selectorProvider(); void register(final SelectableChannel ch, final int interestOps, final NioTask<?> task); int getIoRatio(); void setIoRatio(int ioRatio); void rebuildSelector();  }### Answer:
@Test(timeout = 3000) public void testSelectableChannel() throws Exception { NioEventLoopGroup group = new NioEventLoopGroup(1); NioEventLoop loop = (NioEventLoop) group.next(); try { Channel channel = new NioServerSocketChannel(); loop.register(channel).syncUninterruptibly(); channel.bind(new InetSocketAddress(0)).syncUninterruptibly(); SocketChannel selectableChannel = SocketChannel.open(); selectableChannel.configureBlocking(false); selectableChannel.connect(channel.localAddress()); final CountDownLatch latch = new CountDownLatch(1); loop.register(selectableChannel, SelectionKey.OP_CONNECT, new NioTask<SocketChannel>() { @Override public void channelReady(SocketChannel ch, SelectionKey key) { latch.countDown(); } @Override public void channelUnregistered(SocketChannel ch, Throwable cause) { } }); latch.await(); selectableChannel.close(); channel.close().syncUninterruptibly(); } finally { group.shutdownGracefully(); } }