请教各位一个NIO的问题

04-06-15 isco
我使用了下面一段来接收连接请求,使用的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;

}

}

}

fiddle
2004-06-15 17:05
多半都是永远循环在你的else{break;}那里了,有读或者写发生

你的selector不是ServerSocketChannel 专用的吧?

isco
2004-06-15 17:36
对selector不是ServerSocketChannel专用,SocketChannel同样使用.

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

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

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

猜你喜欢