请教各位一个NIO的问题

我使用了下面一段来接收连接请求,使用的nio包,结果发现在第一次等待连接请求时,程序会阻塞在selector.select()这里.一旦接收到一个连接请求后,程序就不会再阻塞在任何地方,会在for循环里不停的跑,而cpu也基本是100%的转.请问这是什么原因?有什么法子,让cpu不至于这样100%的跑?

for(;;) {
selector.select();
Set keys = selector.selectedKeys();
Iterator i = keys.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
if (key.isAcceptable()) {
SocketChannel client = serverChannel.accept();
return client ;
} else {
break;
}
}
}

多半都是永远循环在你的else{break;}那里了,有读或者写发生

你的selector不是ServerSocketChannel 专用的吧?

对selector不是ServerSocketChannel专用,SocketChannel同样使用.

所以,现在我有点想知道selecto到底有多大用处,在性能上会有多大优越性体验.因为,不用selector照样可以连接,可以读、写。

刚做这方面程序,还望多指点。

selector的用户很大,最简单来说你可以用几个线程完成本来要几百个线程完成的工作。你的服务器本来最多承受300个并发用户链接,那么用nio就可以提升到几千个,当然还要看每个链接给服务器的压力大小。比如聊天服务器这样的,几万我想都没啥问题。