@Override public void run() { while (!mShutdown) { try { // Wait for an event one of the registered channels. mSelector.select(); if (mShutdown) { break; } // Iterate over the set of keys for which events are available Iterator<SelectionKey> selectKeys = mSelector.selectedKeys().iterator(); while (selectKeys.hasNext()) { SelectionKey key = selectKeys.next(); selectKeys.remove(); if (!key.isValid()) { continue; } // Check what event is available and deal with it. // TODO These should be multi-thread. if (key.isAcceptable()) { accept(key); } else if (key.isReadable()) { read(key); } else if (key.isWritable()) { write(key); } } } catch (Exception e) { LOG.error(e.getMessage(), e); if (mShutdown) { break; } throw new RuntimeException(e); } } mShutdowned = true; }