JAVA-NIO之Selector

选择器:能够检测多个NIO通道,能够知晓通道是否为读写连接等事件做好准备,单线程下可以管理多个Channel

使用Selector的优点:
1.创建较少线程来处理多个Channel,可以减少上下文切换的开销

使用过程:
1、Selector创建:Selector.open()
2、向Selector注册Channel:channel.regist(selector,SelectKey.操作),注意,channel必须是非阻塞的,所以FileChannel不能与Selector一起用
3、通过Selector选择通道:调用select()方法返回你感兴趣且准备就绪的通道个数,调用selectedKeys()方法返回你感兴趣且就绪的通道集合,遍历该集合根据具体操作类型进行处理

这里要注意步骤3中select()的几种方式:
1、select():阻塞等待返回就绪的通道个数
2、select(long timeout):设置等待超时时间
3、selectNow():不阻塞直接返回就绪的通道个数,包含不是自己感兴趣的通道

SelectionKey包含如下重要属性:
1、interest集合:通过interestOps()方法获取到返回值再用“位与“操作返回值和给定的操作(如:OP_READ),确定该操作是否在interest集合中
2、ready集合:通道已经就绪的集合,通过readOps()方法获取到返回值,通过1中方式得到ready的操作类型,或者可以直接调用SelectKey.isAcceptable()...等方式来获取
3、channel对象:通过channel()方法获取该SelectionKey包含的Channel属性
4、selector对象:通过selector()方法获取该SelectionKey包含的Selector属性

wakeUp():可以让阻塞在select()方法的线程直接返回值,需要其他线程来调用,如果调用wakeUp()方法时,还没有线程调用select()方法,则下个调用select()方法的线程会立即返回,不会阻塞。

close():关闭Selector,会使SelectionKey实例无效,但Channel不会被关闭

猜你喜欢

转载自blog.csdn.net/ignorewho/article/details/80454980