public NIO start() {
		this.asyncs.offer(new Runnable() {
			@Override
			public void run() {
				try {
					for (;;) {
						// do blocking select
						if (NIO.this.selector.select() <= 0) {
							// may be unblock by wake up,so just ignore
							continue;
						}

						// loop each ready keys
						Iterator<SelectionKey> iterator = NIO.this.selector
								.selectedKeys().iterator();
						while (iterator.hasNext()) {
							// retrieve the key
							SelectionKey key = iterator.next();
							iterator.remove();

							// notify listener
							InternelListener listener = ((InternelListener) key
									.attachment());
							if (listener != null) {
								// notify the real listener
								listener.notifyListener(key);
							}
						}
					}
				} catch (Exception e) {
					NIO.LOGGER.error(
							"unexpected exception in nio select,restart it", e);
				} finally {
					// this should never end,so queue it again
					NIO.this.asyncs.offer(this);
				}
			}
		});

		return this;
	}