NIO-实践

NIO用于高性能Socket编程由来已久,网络也有较为丰富的原理和源代码。我这里主要介绍几点经验总结:

 

1.Selector.select()在筛选就绪的SelectionKey的时候,采用的是阻塞模式。同时只要在就绪的SelectionKey列表中有至少一个SelectionKey存在,前述方法均将返回。

   SocketChannel被Selector检查,检查其声称可以接受的状态是否已经产生,如当SocketChannel在向Selector注册是设置了可接受状态为Read,此时当SocketChannel接收到数据后将进入可读状态。

   如果需要实现一个线程或有效个线程负责对SocketChannel数据的读操作,为了保证线程安全,同一时间需要保证只有一个线程在负责读操作。即需要采用SelectionKey.cancel()从注册的Selector中取消对该Selection的监视,防止同时多个线程获取到SelectionKey的事件

 

2.注册在向Selector注册通道的时候,如果register方法抛出KeyCancelledException表明,当前正在注册的SocketChannel在前一阶段已经注册过,但对应的SelectionKey已处于Cancel状态,此时,应该将通道的注册至于Selector.select()之后注册,这样可以在注册通道时保证SelectionKey的状态不为cancel

 

 

本文粘贴多线程在NIO环境下的基本运用示例代码,同时演示了一个线程如何对多个连接进行读写的操作。

注:本源代码部分源于 “Java NIO原理和使用 ” http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm

 

 

 

 

 

其实读写线程大同小异,但遵循的原理为当前线程完成了读或写操作后,应将通道从新交还给Selector进行继续监控

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值