Selector是SelectableChannel的多路选择器,配合SelectableChannel实现非阻塞IO. 详见代码

/**
* Selector 是 SelectableChannel的多路选择器</p>
* SelectableChannel 通过register函数注册到Selector上</p>
*
* Selector 维护三个key集合:</br>
* 1. 指代当前注册到selector上的channel的key集合</br>
* 执行register操作,将会把channel的key添加到集合中,key集合其本身不可直接修改</br>
* 2. selected-key集合,其中的key指代的channel上至少有一个在上一次selection期间可执行的操作</br>
* 执行select操作,将会把key添加到selected-key集合中.</br>
* 3. cancelled-key集合,其中的key已经被撤销但所指代的channel未从selector注销</br>
* 撤销的key所指代的channel在下一次select期间将会被注销.</br>
* 上述三个集合在Selector创建之初均为空</p>
*
* Selection操作分为三步</p>
* 1. cancelled-key集合中的key将会被从所有key集合中删除,其通道将会被注销.这步执行结束后会导致cancelled-key集合为空</br>
* 2. selection操作开始时,底层操作系统将会返回所有channel当前可执行的操作的key,对于任一符合条件的channel:
* </t>1. 若key不是selected-key的元素,将被加入其中。其可执行的操作集合会被更新,并且通知channel,该集合中之前的所有记录会被丢弃。</br>
* </t>2. 若是selected-key的元素,可执行操作将被添加到集合中,集合中之前的记录保留.</br>
* 3. 若在第二步执行过程中key被加入cancelled-key中,则他们将会按照第一步所述操作处理</br>
*
* @author luojiahu
*
*/
public abstract class Selector implements Closeable { /**
* 返回key集合
* @return
*/
public abstract Set<SelectionKey> keys(); /**
* 返回selected key集合
* @return
*/
public abstract Set<SelectionKey> selectedKeys(); /**
* 阻塞selection timeout时间。不保证实时返回
* @param timeout
* @return
* @throws IOException
*/
public abstract int select(long timeout) throws IOException; /**
* 阻塞selection
* @return
* @throws IOException
*/
public abstract int select() throws IOException; /**
* 非阻塞selection。若从上次selection结束到这次开始没有channel变为selectable则返回0
* @return
* @throws IOException
*/
public abstract int selectNow() throws IOException;
}

  Selector 和 SelectableChannel间通过SelectionKey表示注册关系:

/**
* 表示selectable channel在selector上的注册关系</p>
*
* 维护两个operation set: 1. interest set 2. ready set</p>
*
* 线程安全</p>
*
* 支持attachment</p>
* @author luojiahu
*
*/
public abstract class SelectionKey { /**
* 返回对应的channel
* @return
*/
public abstract SelectableChannel channel(); /**
* 返回对应的Selector
* @return
*/
public abstract Selector selector(); /**
* 解除channel和register间的注册关系
*/
public abstract void cancel(); /**
* 返回interest operation set
* @return
*/
public abstract int interestOps(); /**
* 设置interest operation set
* @param ops
* @return
*/
public abstract SelectionKey interestOps(int ops); /**
* 返回 ready operation set
* @return
*/
public abstract int readyOps(); /**
* 读,写,连接,接受连接
*/
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; /**
* 是否可读
* @return
*/
public final boolean isReadable() {
return (readyOps() & OP_READ) != 0;
}
}

  SelectorProvider

  SelectorProvider用于提供selector或者 selectable channel, 其本身持有一个SelectorProvider类型的对象。在一个JVM中SelectorProvider只有一个实例,通过本身的provider方法返回JVM唯一的SelectorProvider。

Java NIO 之 Selector的更多相关文章

  1. Java NIO类库Selector机制解析(下)

    五.  迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/O要设计成这个样子?如果说老的I/O不能多路复用,如下图所示,要开N多的线程去挨个侦听每一个Channel ...

  2. Java NIO类库Selector机制解析(上)

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  3. Java NIO 选择器(Selector)的内部实现(poll epoll)

    http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NI ...

  4. Java NIO类库Selector机制解析--转

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  5. Java NIO之Selector(选择器)

    历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂re ...

  6. Java NIO 选择器(Selector)的内部实现(poll epoll)(转)

    转自:http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java ...

  7. Java NIO之Selector

    选择器是JavaNIO重磅推出的一个概念:在旧有的系统中为了跟踪多端口消息,需要为每一个端口配备一个线程做监听:但是有了selector就不需要了,一个Selector可以管理一众渠道(channel ...

  8. Netty快速入门(05)Java NIO 介绍-Selector

    Java NIO Selector Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读.可写.如此可以实现单线程管理多个channels,也就是 ...

  9. Java NIO教程 Selector

    这次我们开讲非阻塞I/O中的Selector,它需要配合非阻塞的TCP和UDP来使用.首先我们先简单讲一下TCP和UDP的非阻塞通道. 非阻塞I/O通道 在上代码前我们先讲解一些最基本的知识.TCP和 ...

  10. JAVA NIO 之 Selector 组件

    NIO 重要功能就是实现多路复用.Selector是SelectableChannel对象的多路复用器.一些基础知识: 选择器(Selector):选择器类管理着一个被注册的通道集合的信息和它们的就绪 ...

随机推荐

  1. 数据挖掘概念与技术15--为快速高维OLAP预计算壳片段

    1. 论数据立方体预计算的多种策略的优弊 (1)计算完全立方体:需要耗费大量的存储空间和不切实际的计算时间. (2)计算冰山立方体:优于计算完全立方体,但在某种情况下,依然需要大量的存储空间和计算时间 ...

  2. Zabbix实战-简易教程--动作(Actions)--触发器

    一.概述 我们通过接入agent,采集了大量数据,但是如果采集到的某个指标超出了我预计的范围(阈值),此时我们希望监控系统能够给予邮件或短信报警,触发器就是替你干这个活的. 触发器表达式允许定义一个什 ...

  3. 【jQuery】(7)---jQueryAjax同步异步区别

    jQueryAjax同步异步 今天在项目开发过程中,要实现这么一个功能 <!-- 当我点击就业的时候,触发onclick时间,check()方法里通过ajax请求返回数据, 如果该用户已经毕业可 ...

  4. JavaScript基础知识(JSON、Function对象、原型、引用类型)

    19.JSON 概念:JavaScript 对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式  特点:易于程序员编写和查看:易于计算机解析和生成 数据结构 ...

  5. 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  6. HDU--2114

    Calculate S(n) Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. python笔记一(正则表达式)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 1 如果直接给出字符,则表示精确匹配 # 2 \d 表示数字, \w 表示字母或数字, . 可以匹配任意 ...

  8. 以太坊RPC机制与API实例

    上一篇文章介绍了以太坊的基础知识,我们了解了web3.js的调用方式是通过以太坊RPC技术,本篇文章旨在研究如何开发.编译.运行与使用以太坊RPC接口. 关键字:以太坊,RPC,JSON-RPC,cl ...

  9. input框type=file设置cursor:pointer的问题

    为了让美化上传文件框,设置了cursor:pointer;,然而不起作用,然后百度找到了解决方法,设置font-size:0,这样就可以了.

  10. Spark学习笔记1(初始spark

    1.什么是spark? spark是一个基于内存的,分布式的,大数据的计算框架,可以解决各种大数据领域的计算问题,提供了一站式的服务 Spark2009年诞生于伯克利大学的AMPLab实验室 2010 ...