尚硅谷Netty系列学习笔记七《NIO核心组件之Selector》

本文介绍了Java NIO中的Selector组件,强调了其在非阻塞IO中的作用,允许单线程处理多个客户端连接。Selector能够检测并处理多个通道上的事件,降低了系统开销,避免了多线程上下文切换。文章详细阐述了Selector的创建、通道注册、事件监听等关键步骤,并列举了四种关注的事件类型:OP_ACCEPT、OP_CONNECT、OP_READ和OP_WRITE。最后,作者提出了关于通道能否注册多个事件的疑问,预告了后续章节的内容。
摘要由CSDN通过智能技术生成

前言:1.由于工作需要,需要学习下Netty框架,随对学习进行整理。方便后期的翻阅。大家也可以借鉴下。

           2.学习基于尚硅谷的Netty视频教程,笔记也会查阅其他资料来完善观看视频中本人理解模糊的地方。

了解Selector

1.Java的NIO,用非阻塞的IO方式,就可以用一个线程,处理多个客户端连接,就需要使用到Selector(选择器)

     注意:NIO  有两种模式,阻塞模式和非阻塞模式,需要手动设置configureBlocking(false);为非阻塞模式,才可以使用选择器。

2.多个Channel以事件的方式可以注册到同一个Selector上,Selector 能够检测 多个已注册的通道上是否有事件发生,

     如果有事件发生,便获取事件然后针对每个事件进行相应的处理,这样就可以只用一个线程去管理多个通道,也就是管理多个连接和请求

3.只有在连接真正有读写事件发生时,才会进行读写,就大大地减少了系统开销,并且不必为每个连接创建一个线程,不用去维护多个线程,

4.避免了多线程之间的上下文切换导致的开销

 

Selector类相关方法:

Selector类是一个抽象类,常用方法和说明如下:

//1.得到一个选择器
public static Selector open()
//2.监控所有注册的通道,当其中有IO操作可以进行 时,将对应的SelectionKey加入到内部稽核并返回,
//参数用来设置超时时间。如果一直没有IO操作,线程会等待 timeout 的时间。
public int select(long timeout)
//3.不会阻塞的方法,立即返回结果!
public int selectNow()
//4.当有IO操作后,通过调用 selectedKeys方法获取等待操作的selectedKey集合
public Set<SelectionKey> selectedKeys()


Selector大致使用流程就是,

1.创建通道Channel,

2.创建Selector:public static Selector open()

3.Channel开启非阻塞模式:configureBlocking(false)

4.创建的Channel注册到Selector上,并设置关心的事件:Channel.register(selector, SelectionKey.OP_ACCEPT);

 

5.Selector 对象的 public int select(long timeout)方法监听 注册的通道 有没有触发对应事件

6.检测到事件之后 通过调用 public Set<SelectionKey> selectedKeys()方法 获取触发了事件的SelectionKey集合

7.遍历SelectionKey,可以从中获取对应的通道对象,和触发的事件,再进行对应的业务处理即可

注册事件时,关心事件的选择有以下四种

OP_ACCEPT:新连接  值:16
OP_CONNECT:连接已建立 值:8
OP_READ:读 值:1
OP_WRITE:写 值:4

具体的代码演示将放在下一节中演示!本章只了解一下Selector机制和常用的方法!

思考:通道注册到Seletor上只能设置一个事件嘛?那我多个事件需要处理怎么办?(本人学到当前阶段的一个疑问,将在后续学习中解惑,并记录到文章中)

下一节:尚硅谷Netty系列学习笔记八《NIO快速入门》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值