NIO之Selector
来源:互联网 发布:智能电视哪个网络品牌 编辑:程序博客网 时间:2024/06/02 02:07
Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。
Selector的创建
通过调用Selector.open()方法创建一个Selector,如下:
Selector selector = Selector.open();
向Selector注册通道
SelectionKey key = channel.register(selector, Selectionkey.OP_READ);
与Selector一起使用时,Channel必须处于非阻塞模式下。这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以。
注意register()方法的第二个参数。这是一个“interest集合”,意思是在通过Selector监听Channel时对什么事件感兴趣。可以监听四种不同类型的事件:
Connect SelectionKey.OP_CONNECT
Accept SelectionKey.OP_ACCEPT
Read SelectionKey.OP_READ
Write SelectionKey.OP_WRITE
通道触发了一个事件意思是该事件已经就绪。所以,某个channel成功连接到另一个服务器称为“连接就绪”。一个server socket channel准备好接收新进入的连接称为“接收就绪”。一个有数据可读的通道可以说是“读就绪”。等待写数据的通道可以说是“写就绪”。
SelectionKey
表示Channel 在 Selector 中的注册的标记。
当向Selector注册Channel时,register()方法会返回一个SelectionKey对象。这个对象包含了一些你感兴趣的属性:
interest集合
ready集合
Channel
Selector
附加的对象(可选)
interest集合
就像向Selector注册通道中所描述的,interest集合是你所选择的感兴趣的事件集合。可以通过SelectionKey读写interest集合
ready集合
ready 集合是通道已经准备就绪的操作的集合。在一次选择(Selection)之后,你会首先访问这个ready set。 int readySet = selectionKey.readyOps();
可以使用以下四个方法,它们都会返回一个布尔类型:
1.selectionKey.isAcceptable();
2.selectionKey.isConnectable();
3.selectionKey.isReadable();
4.selectionKey.isWritable();
从SelectionKey访问Channel和Selector很简单。如下:
view sourceprint?
1
Channel channel = selectionKey.channel();
2
Selector selector = selectionKey.selector();
附加的对象
可以将一个对象或者更多信息附着到SelectionKey上,这样就能方便的识别某个给定的通道。例如,可以附加 与通道一起使用的Buffer,或是包含聚集数据的某个对象。使用方法如下:
selectionKey.attach(theObject);Object attachedObj = selectionKey.attachment();
还可以在用register()方法向Selector注册Channel的时候附加对象。如:
SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject);
Selector选择通道
一旦向Selector注册了一或多个通道,就可以调用几个重载的select()方法。这些方法返回你所感兴趣的事件(如连接、接受、读或写)已经准备就绪的那些通道。换句话说,如果你对“读就绪”的通道感兴趣,select()方法会返回读事件已经就绪的那些通道。
select()阻塞到至少有一个通道在你注册的事件上就绪了。
select()方法返回的int值表示有多少通道已经就绪。亦即,自上次调用select()方法后有多少通道变成就绪状态。如果调用select()方法,因为有一个通道变成就绪状态,返回了1,若再次调用select()方法,如果另一个通道就绪了,它会再次返回1。如果对第一个就绪的channel没有做任何操作,现在就有两个就绪的通道,但在每次select()方法调用之间,只有一个通道就绪了。
selectedKeys()
一旦调用了select()方法,并且返回值表明有一个或更多个通道就绪了,然后可以通过调用selector的selectedKeys()方法,访问“已选择键集(selected key set)”中的就绪通道。如下所示:
Set selectedKeys = selector.selectedKeys();
当像Selector注册Channel时,Channel.register()方法会返回一个SelectionKey 对象。这个对象代表了注册到该Selector的通道。可以通过selector.selectedKeys()方法访问这些对象。
- JAVA NIO之selector
- Java NIO之Selector
- Java NIO之Selector
- Java NIO 之selector
- Java NIO 之 Selector
- 十、Nio之Selector
- Java NIO之Selector
- Java NIO之Selector
- NIO之Selector
- Nio总结之Selector
- NIO 之 Selector实现原理
- java-nio之Selector组件
- NIO之channel与selector
- NIO---selector
- NIO Selector
- NIO-Selector
- NIO Selector
- NIO Selector
- Nginx是什么
- AMD OpenCL 大学课程
- 如何使用siege对接口进行性能测试
- 详解java定时任务
- 循环
- NIO之Selector
- DFS学习借鉴的博客
- sublime连接linux
- 详解PHP实现定时任务的五种方法
- 【备忘】全网首发Spring4.x SpringMVC S4Struts2Hibernate4整合高清视频
- POJ 3177 Redundant Paths(边双连通分量+缩点)
- 返回函数
- U3d中播放视频的三种方法-适合UGUI
- usaco Broken Necklace