请教一个关于NIO执行方式的问题

wy123456789 04-03-01
    

用一般的DatagramSocket监听端口上的消息用如下代码
while(isRun){

receiverByte=new byte[Global.DATAGRAM_BYTES];
receiverDatagramPacket=new DatagramPacket
(receiverByte,receiverByte.length);

try{
1: receiverDatagramSocket.receive(receiverDatagramPacket);
}catch(IOException ex){
ex.printStackTrace();
}
//do something for packet
}

此种方法在1:处会阻塞

使用NIO的代码

DatagramChannel dc = DatagramChannel.open() ;
dc.configureBlocking( false ) ;
InetSocketAddress address = new InetSocketAddress( InetAddress.
getLocalHost() , 9000 ) ;

DatagramSocket s = dc.socket() ;
s.bind( address ) ;

Selector select = Selector.open() ;
SelectionKey key = dc.register( select , SelectionKey.OP_READ ) ;

ByteBuffer cb = ByteBuffer.allocate( 100 ) ;

while(true){
cb.clear() ;

int num = select.select() ; 2:

Set selectedKeys = select.selectedKeys() ;
Iterator it = selectedKeys.iterator() ;


while( it.hasNext() ){
SelectionKey k = ( SelectionKey )it.next() ;
if( ( k.readyOps() & SelectionKey.OP_READ )
== SelectionKey.OP_READ ){
DatagramChannel cc = ( DatagramChannel )k.channel() ;
cc.receive( cb ) ;
System.out.println( new String( cb.array() ) ) ;
}
}
}

此方法在2:处阻塞,仍然使用无限循环监听端口,这样与一般方法不就是一样了吗?
NIO的中断 方式不就没什么意义了么?怎样以次来提高性能呢?

2者本质上有何区别

    

wy123456789
2004-03-01 19:49

自己顶

传统方法,NIO其实都是使用轮询,那为什么NIO的效率高呢(除开Buffer的影响)

我简单的测试了一下,使用NIO接收一个UDP消息,与传统方法差不多(还稍微差一点)

banq
2004-03-03 09:36

NIO写法不对的。
NIO就是无堵塞,特别是访问量特别大,并发很厉害是显现。

wy123456789
2004-03-03 18:57

在Set selectedKeys = select.selectedKeys() ;处
是否阻塞??

如果此处不阻塞,则会不停的While循环(虽然什么也不作),不是降低了效率么,

banq
2004-03-04 09:31

不停的循环是查询数据,需要加一个sleep,否则CPU被你这个线程霸占了。

Set selectedKeys = select.selectedKeys() 不会堵塞,关于NIO见
http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm

其实是一个轮询原理。

2Go 1 2 下一页