JAVA-NIO之Selector

NIO选择器详解
本文详细介绍了Java NIO中的选择器(Selector),包括其优点、使用过程及关键方法。选择器能够有效管理多个Channel,减少线程上下文切换的开销,并支持不同类型的事件检测。
选择器:能够检测多个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不会被关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值