Java NIO之Selector
介绍
Selector选择器是java nio中能检测多个Channel通道,并能够知晓通道是否为诸如读写时间做好准备的组件。
即Selector相当于监控着注册在其上的所有Channel通道,主要是为了减少新建线程占用资源。
Selector必须要和非阻塞的管道结合使用,比如SocketChannel/ServerSocketChannel.不能和FileChannel管道一起使用,
因为FileChannel是阻塞模型,无法将其切换到非阻塞模型。
备注:Selector通常是在开发高性能网络编程时会使用。
Selector应用
// 套接字管道
SocketChannel socketChannel = SocketChannel.open();
// 新建选择器
Selector selector = Selector.open();
// 配置/切换管道阻塞模型
socketChannel.configureBlocking(false);
// 将非阻塞管道注册到选择器中(指定选择器的监听事件类型)
SelectionKey selectionKey = socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
/**
* 四种监听事件类型(定义在SelectionKey中)
*
* OP_READ 读取事件 <br>
* OP_WRITE 写入事件<br>
* OP_CONNECT 连接事件<br>
* OP_ACCEPT 接收事件<br>
*
*
* 通道触发了一个事件意思是该事件已经就绪。<br>
*
* 所以,某个channel成功连接到另一个服务器称为“连接就绪”。<br>
* 一个server socket channel准备好接收新进入的连接称为“接收就绪”。<br>
* 一个有数据可读的通道可以说是“读就绪”。<br>
* 等待写数据的通道可以说是“写就绪”。
*/
// 备注:Selector有点像配置中心,同时它也提供监控功能,SelectionKey有点像具体的配置。
参考
1、http://ifeve.com/selectors/
2、http://blog.csdn.net/anders_zhuo/article/details/8535719