Java NIO 之 Selector

  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。

原文地址:https://www.cnblogs.com/luojiahu/p/8414372.html

时间: 2024-10-25 13:34:29

Java NIO 之 Selector的相关文章

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

http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NIO中的选择器依赖操作系统内核的这些系统调用,我们这里只讲解与linux内核相关的NIO实现,当然,windows或其他操作系统实现大体上是类似的,相信大家也可以触类旁通. 那么,本文从这里将从简到难,一步一步为大家讲解选择器的点点滴滴吧. 选择器的宏观理解“有这么一种检查员,她工作在养鸡场,每天的工

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

一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: Buffer:包含数据且用于读写的线形表结构.其中还提供了一个特殊类用于内存映射文件的I/O操作. Charset:它提供Unicode字符串影射到字节序列以及逆映射的操作. Channels:包含socket,file和pipe三种管道,都是全双工的通道. Selector:多个异步I/O操作集

Java NIO 之 Selector 练习

目的:本编文章主要想分享一下NIO方面的知识,由于最近几天工作不忙,趁机学习了下Java NIO Selector的相关知识:主要是实践操作的:具体的理论知识,可以参考网上的文章. 测试用例主要有三种方式: 其实,是服务器端的逻辑不变,客户端有三种方式而已. 服务器端:2个selector + channel, 客户端:一个channel 服务器端:2个selector + channel, 客户端:多个channel(多线程方式) 服务器端:2个selector + channel, 客户端:

Java NIO之Selector

选择器是JavaNIO重磅推出的一个概念:在旧有的系统中为了跟踪多端口消息,需要为每一个端口配备一个线程做监听:但是有了selector就不需要了,一个Selector可以管理一众渠道(channel). 选择器的本质就是:让监听的工作由选择起来做:它会定时执行来获取注册到他那里的渠道是否已经准备就绪,比如socketServerChannel是否有新的消息过来(是否做好了accept的准备):然后他会把这个channel放入到一个集合中(SelectedKeys),遍历一遍之后,就可以,你就可

Java NIO (6) Selector

Java NIO Selector A Selector is a Java NIO component which can examine one or more NIO Channel's, and determine which channels are ready for e.g. reading or writing. This way a single thread can manage multiple channels, and thus multiple network con

JAVA NIO 之 Selector 组件

NIO 重要功能就是实现多路复用.Selector是SelectableChannel对象的多路复用器.一些基础知识: 选择器(Selector):选择器类管理着一个被注册的通道集合的信息和它们的就绪状态. 可选择通道(SelectableChannel):这个抽象类提供了实现通道的可选择性所需要的公共方法.它是所有支持就绪检查的通道类的 父类.例如:ServerSocketChannel.SocketChannel.可选择通道可以被注册到选择器上. 选择键(SelectionKey):选择键封

【JAVA】【NIO】7、Java NIO Selector

selector是Java NIO的组件可以检查一个或多个NIO的channel,并且决定哪个channel是为读写准备好了.这种方式,单个线程可以管理多个channel,也就是多个网络连接. 为什么使用选择器 优点就是更少的线程去处理多个通道.实际上,你可以使用一个线程去处理所有的通道.操作系统中线程的切换是很费资源的,而且每个线程本身也占用了一些资源(内存).所以使用的线程越少越好! 现在的操作系统和CPU在多任务上变得越来越好,所以多线程的开销也变得更小了.事实上,如果一个CPU有多个核心

(四:NIO系列) Java NIO Selector

出处:Java NIO Selector 1.1. Selector入门 1.1.1. Selector的和Channel的关系 Java NIO的核心组件包括: (1)Channel(通道) (2)Buffer(缓冲区) (3)Selector(选择器) 其中Channel和Buffer比较好理解 ,联系也比较密切,他们的关系简单来说就是:数据总是从通道中读到buffer缓冲区内,或者从buffer写入到通道中. 选择器和他们的关系又是什么? 选择器(Selector) 是 Channel(通

7. 彤哥说netty系列之Java NIO核心组件之Selector

<p align="right">--日拱一卒,不期而至!</p> 你好,我是彤哥,本篇是netty系列的第七篇. 简介 上一章我们一起学习了Java NIO的核心组件Buffer,它通常跟Channel一起使用,但是它们在网络IO中又该如何使用呢,今天我们将一起学习另一个NIO核心组件--Selector,没有它可以说就干不起来网络IO. 概念 我们先来看两段Selector的注释,见类java.nio.channels.Selector. 注释I A mul