请教一个关于NIO执行方式的问题
用一般的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者本质上有何区别