Java NIO之Selector

Selector
Selector 一般称 为选择器 ,也可以翻译为 多路复用器 。它是 Java NIO 核心组件中
的一个,用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写。如
此可以实现单线程管理多个 channels,也就是可以管理多个
在这里插入图片描述
使用 Selector 的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个
线程,避免了线程上下文切换带来的开销。
注意:
(1)不是所有的 Channel 都可以被 Selector 复用的。比方说,FileChannel 就不能
被选择器复用。判断一个 Channel 能被 Selector 复用,有一个前提:判断他是否继
承了一个抽象类 SelectableChannel。如果继承了 SelectableChannel,则可以被复
用,否则不能。
(2)一个通道可以被注册到多个选择器上,但对每个选择器而言只能被注册一次。通
道和选择器之间的关系,使用注册的方式完成。SelectableChannel 可以被注册到
Selector 对象上,在注册的时候,需要指定通道的哪些操作,是 Selector
如何轮询查询就绪操作
首次调用 select()方法,如果有一个通道变成就绪状态,返回了 1,若再次调用
select()方法,如果另一个通道就绪了,它会再次返回 1。如果对第一个就绪的
channel 没有做任何操作,现在就有两个就绪的通道,但在每次 select()方法调用之间,
只有一个通道就绪了。
一旦调用 select()方法,并且返回值不为 0 时,在 Selector 中有一个 selectedKeys()方
法,用来访问已选择键集合,迭代集合的每一个选择键元素,根据就绪操作的类型,
完成对应的操作:

Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if(key.isAcceptable()) {

} else if (key.isWritable()) {
}
keyIterator.remove();
}

选择器执行选择的过程,系统底层会依次询问每个通道是否已经就绪,这个过程可能
会造成调用线程进入阻塞状态,那么我们有以下三种方式可以唤醒在 select()方法中
阻塞的线程。
wakeup()方法 :通过调用 Selector 对象的 wakeup()方法让处在阻塞状态的
select()方法立刻返回
该方法使得选择器上的第一个还没有返回的选择操作立即返回。如果当前没有进行中
的选择操作,那么下一次对 select()方法的一次调用将立即返回。
close()方法 :通过 close()方法关闭 Selector,
该方法使得任何一个在选择操作中阻塞的线程都被唤醒(类似 wakeup()),同时
使得注册到该 Selector 的所有 Channel 被注销,所有的键将被取消,但是 Channel
本身并不会关闭。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值