Selector介绍
基本介绍:
- Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端的连接,就会使用到Selector(选择器)
- Selector能够检测多个注册的通道上是否有事件发生,注意多个Channel以事件的发生可以注册到同一个Selector,如果有事件发生,变获取事件然后真对每个事件进行相应的处理,这样就可以只用要给单线程去管理多个通道,也就是管理多个连接和请求。
- 只有在真正读写的时候,才会发生,大大减少了系统的开销。
- 避免了线程之间的上下文切换
特点强调
- Netty 的IO 线程NioEventLoop 聚合了Selector(选择器,也叫多路复用器),可以同时并发处理成百上千个客户端连接。
- 当线程从某客户端Socket通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务
- 线程通常将非阻塞IO 的空闲时间用于在其他通道上执行IO操作,所以单独的线程可以管理多个输入和输出通道。
- 由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起。
- 一个I/O 线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞IO一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。
相关方法
Selector是一个抽象列
public abstract class Selector implements Closeable{}
open方法:得到一个选择器对象
public static Selector open() throws IOException {
return SelectorProvider.provider().openSelector();
}
select方法,监控所有的注册通道,当其中有IO操作可以进行,将对应的selectKey加入到内部集合中并返回,参数用来设置超时时间 (有两个重载方法)
public abstract int select() throws IOException;
public abstract int select(long timeout)
throws IOException;
public abstract int selectNow() throws IOException;
SelectKeys方法,从内部集合中得到所有的SelectKey
public abstract Set<SelectionKey> selectedKeys();
注意事项
- NIO中的ServerSocketChannel功能类似SocketChannel,SocketChannel类似于Sockett
- selector相关方法说明
- selector.select() // 阻塞
- selector.select(1000) // 阻塞1000毫秒,在结束后返回
- selector.wakeup() // 唤醒selector
- selector.selectNow() //不阻塞,马上返回
NIO非阻塞网络编程原理分析图
-
NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel关系图梳理)
-
对上图的说明
- 当客户端连接时,会通过ServerSocketChannel得到SocketChannel
- Selector进行监听select方法,返回有事件发生的通道的个数
- 将SocketChannel注册到Selector上,register(Selector sel, int ops)一个selector上可以注册多个SocketChannel
- 注册后返回一个SelectionKey,会和该Selector 关联(集合)
- 再得到Channel,完成业务逻辑
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END