开发者社区> 问答> 正文

关于SelectionKey

下文中的 key 是做什么用的?代表的什么含义?文中只提到了key的生命周期 没提到他代表的意义和作用啊?表示的是状态,tcp这些请求的状态要我们自己控制,不是socket监控的,所以才需要主动register注册?既然如此,注册的意义是什么? 就是有点不理解代码为什么要这么做?多路复用器 也要设置成不同的事件进行监听 对应的不通事件进行响应和通知?
1.png 2.png 3.png
来源:云原生后端社区

展开
收起
Atom 2020-04-25 13:26:13 773 0
1 条回答
写回答
取消 提交回答
  • Java的Selector调用操作系统层的Multiplexing IO(多路复用模型),本身只是个API调用。而多路复用是这个样子的:
    1.png
    I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流. 而这段点代码SelectionKey key = channel.register(selector, SelectionKey.OP_READ); register()方法的第二个参数,这是一个”interest集合“,意思是在通过Selector监听Channel时对什么事件感兴趣.
    可以监听四种不同类型的事件:
    Connect
    Accept
    Read
    Write
    通道触发了一个事件意思是该事件已经就绪。所以,某个channel成功连接到另一个服务器称为”连接就绪“。一个server socket channel准备好接收新进入的连接称为”接收就绪“。一个有数据可读的通道可以说是”读就绪“。等代写数据的通道可以说是”写就绪“。 只要ServerSocketChannel及SocketChannel向Selector注册了特定的事件,Selector就会监控这些事件是否发生。SelectableChannel的register()方法返回一个SelectionKey对象,该对象是用于跟踪这些被注册事件的句柄。在执行Selector的select()方法时,如果与SelectionKey相关的事件发生了,这个SelectionKey就被加入到selected-keys集合中,程序直接调用selected-keys集合的remove()方法,或者调用它的iterator的remove()方法,都可以从selected-keys集合中删除一个SelectionKey对象。
    通过调用某个SelectionKey的cancel()方法,关闭其通道,或者通过关闭其选择器来取消该Key之前,它一直保持有效。取消某个Key之后不会立即从Selector中移除它,相反,会将该Key添加到Selector的已取消key set,以便在下一次进行选择操作的时候移除它。所以简单来说,上面的那个selectionKey就是一种注册事件,而每一种事件对应着这个连接的一种状态,多路复用模型会检查每个连接所对应的状态,如果达到其中的一种状态,就会触发对应的事件处理逻辑。


    来源:云原生后端社区

    2020-04-25 13:29:54
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载