Selector类

概念

一个SelectableChannel对象的多路复用器,即Selector可以使一个单独的线程管理多个ChannelSelector是非阻塞IO的核心(多路复用)

引入

  • 传统的IO 流都是阻塞式的。也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO 操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理, 当服务器端需要处理大量客户端时,性能急剧下降。
  • NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞IO 的空闲时间用于在其他通道上执行IO 操作,所以单独的线程可以管理多个输入和输出通道。因此,NIO 可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端

如何创建

  1. 一个selector可以通过执行这个类的open方法创建,该方法将使用系统的默认选择器提供程序来创建新的选择器。
    Selector.open()
  1. 通过一个自定义的selector提供者的openSelector方法
    private final SelectorProvider provider;
    provider.openSelector();
  1. 一个selector选择器将保持打开状态,知道调用close方法使其关闭
    selector.close();

Selection key

一个可选择的channel注册一个selector后可以由一个SelectionKey表示、一个selector会维护三组selection key

  • key set里包含的key表示当前注册到``selector的channel。可以通过调用keys方法返回这个集合()
  • selected-key set通过方法selectedKeys返回关注事件的集合
  • cancelled-key set没有方法直接访问,是key set的一个子集,已经被取消但是频道还没有被注销

selector刚被创建的时候,这三种集合都是空的。
通过channelregister方法,把一个接受的事件的keychannel注册到selector

    // 把我们的serverSocketChannel注册到 selector,关心事件 OP_ACCEPT
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

通过Selection的操作事件,可以把key加入到selected-key set

    public static final int OP_READ = 1 << 0;
    public static final int OP_WRITE = 1 << 2;
    public static final int OP_CONNECT = 1 << 3;
    public static final int OP_ACCEPT = 1 << 4;

可以调用key的remove方法,或者iterator的remove方法,将key从selected-key set里移除

    // 手动从集合中溢出当前的selectionKey,防止重复操作
    keyIterator.remove();
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、简介 1.1、Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,就会使用到S...
    小波同学阅读 1,537评论 0 1
  • Selector简述 A multiplexor of {@link SelectableChannel} obj...
    locoder阅读 13,106评论 0 4
  • Android网络编程 目录 1、Java NIO 介绍 NIO是java New IO的简称,在jdk1.4里提...
    香沙小熊阅读 4,989评论 0 6
  • 1. 概述   Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接...
    未名枯草阅读 2,647评论 0 5
  • SelectorSelector允许一个单一的线程来操作多个Channel。如果我们的应用程序使用了多个Chann...
    水欣阅读 830评论 0 0

友情链接更多精彩内容