Selector介绍

Selector介绍

基本介绍:

  1. Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端的连接,就会使用到Selector(选择器)
  2. Selector能够检测多个注册的通道上是否有事件发生,注意多个Channel以事件的发生可以注册到同一个Selector,如果有事件发生,变获取事件然后真对每个事件进行相应的处理,这样就可以只用要给单线程去管理多个通道,也就是管理多个连接和请求。
  3. 只有在真正读写的时候,才会发生,大大减少了系统的开销。
  4. 避免了线程之间的上下文切换

特点强调

Selector特点强调.png

  1. Netty 的IO 线程NioEventLoop 聚合了Selector(选择器,也叫多路复用器),可以同时并发处理成百上千个客户端连接。
  2. 当线程从某客户端Socket通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务
  3. 线程通常将非阻塞IO 的空闲时间用于在其他通道上执行IO操作,所以单独的线程可以管理多个输入和输出通道。
  4. 由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起。
  5. 一个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();

注意事项

  1. NIO中的ServerSocketChannel功能类似SocketChannel,SocketChannel类似于Sockett
  2. selector相关方法说明
    1. selector.select() // 阻塞
    2. selector.select(1000) // 阻塞1000毫秒,在结束后返回
    3. selector.wakeup() // 唤醒selector
    4. selector.selectNow() //不阻塞,马上返回

NIO非阻塞网络编程原理分析图

  • NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel关系图梳理)
    ### NIO非阻塞网络编程原理分析图.png

  • 对上图的说明

  1. 当客户端连接时,会通过ServerSocketChannel得到SocketChannel
  2. Selector进行监听select方法,返回有事件发生的通道的个数
  3. 将SocketChannel注册到Selector上,register(Selector sel, int ops)一个selector上可以注册多个SocketChannel
  4. 注册后返回一个SelectionKey,会和该Selector 关联(集合)
  5. 再得到Channel,完成业务逻辑

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYopTcSA' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片