`

SelectionKey源码解析

阅读更多
SelectionKey源码解析


转载自:http://blog.csdn.net/robinjwong/article/details/41792623

SelectionKey表示监听的事件。将channel注册到selector上时,需要声明SelectionKey,以此声明监听事件。(这样Selector才知道需要记录什么数据)

注:
句柄:可以认为是对象身份的唯一id,标识应用程序中的不同对象和同类中的不同的实例。句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。

解析jdk源码:
//表示SelectableChannel 在Selector中的注册的标记/句柄
public abstract class SelectionKey {

	//构造该类的一个实例。
    protected SelectionKey() { }
	
	//返回创建此键的通道。即使在键被取消后,该方法将仍然返回通道。
    public abstract SelectableChannel channel();

	//返回创建此键的选择器。该方法将在取消键后,继续返回选择器。
    public abstract Selector selector();

	//说明此键是否有效。key在创建时是有效的,直到它被取消,其通道关闭,或其选择器关闭。
    public abstract boolean isValid();

	/**
	 *请求用选择器注册这个密钥的通道。
	 *被取消。在返回时,key将无效并将一直存在。
     *添加到选择器的取消键集中。
     *在下一次选择操作中所有选择器的键集将被移除。
     *如果这个键已经被取消了,那么调用这个方法就没有影响。一旦取消,key将永远无效。
     *这个方法可以在任何时候调用。它同步选择器的取消键集,因此在调用时可能会阻塞。
	 *与取消或选择有关的操作同时进行。
	 */
    public abstract void cancel();

	/**检索此键的兴趣集。(既SelectionKey选择的4个监听key)
	 *保证返回的集合只包含对该密钥通道操作有效的位。这个方法可以在任何时候调用。
	 *不管它是否阻塞,以及实现依赖的时间长短。
     */
	public abstract int interestOps();

	/**
	 *将此键的兴趣设置为给定值。这个方法可以在任何时候调用。
	 *不管它是否阻塞,以及实现依赖的时间长短。
	 */
    public abstract SelectionKey interestOps(int ops);

    //检索此键的已操作集。
    public abstract int readyOps();

    /**
     *操作设置位用于读取操作。 1不进行左移
     *假设一个选择键的兴趣集包含OP_READ。如果选择器
	 *检测到对应的通道已准备好读取,已经到达。
	 *结束流,已被远程关闭以供进一步阅读或使用。
	 *在未处理的情况下,它将添加OP_READ到关键字。
	 *已经操作的集合,并将键添加到它的选择键。
	 */
    public static final int OP_READ = 1 << 0;

	//写操作 1左移2位--4
    public static final int OP_WRITE = 1 << 2;

	//客户端请求连接服务端 1左移3位--8
    public static final int OP_CONNECT = 1 << 3;

	//服务端请求连接客户端 1左移4位--16
    public static final int OP_ACCEPT = 1 << 4;

    /**
     *测试此键的通道是否可以读取。
     *如不支持读取操作,则返回false。
     */
    public final boolean isReadable() {
        return (readyOps() & OP_READ) != 0;
    }

    //测试此键的通道是否可以写入。
    public final boolean isWritable() {
        return (readyOps() & OP_WRITE) != 0;
    }

	//测试此键的通道是否可以连接。
    public final boolean isConnectable() {
        return (readyOps() & OP_CONNECT) != 0;
    }
	
	//测试此键的通道是否可以连接。
    public final boolean isAcceptable() {
        return (readyOps() & OP_ACCEPT) != 0;
    }
    
    private volatile Object attachment = null;

    private static final AtomicReferenceFieldUpdater<SelectionKey,Object>
        attachmentUpdater = AtomicReferenceFieldUpdater.newUpdater(
            SelectionKey.class, Object.class, "attachment"
        );

	//将给定对象连接到此键。
    public final Object attach(Object ob) {
        return attachmentUpdater.getAndSet(this, ob);
    }
	
	//检索当前的附件。
    public final Object attachment() {
        return attachment;
    }

}
分享到:
评论

相关推荐

    Java NIO——Selector机制解析三(源码分析)

    本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...

    NIO-实践-多线程实例

    同时只要在就绪的SelectionKey列表中有至少一个SelectionKey存在,前述方法均将返回。 SocketChannel被Selector检查,检查其声称可以接受的状态是否已经产生,如当SocketChannel在向Selector注册是设置了可接受...

    java selector类的用法举例

    #### 五、关键概念解析 - **SelectionKey**: `SelectionKey`是`Channel`和`Selector`之间的桥梁,它包含以下信息: - 关联的`Channel`。 - 关联的`Selector`。 - 通道的“兴趣集”,即希望`Selector`监控的事件...

    NIO项目源码.zip

    - `java.nio.channels.SelectionKey`:每个已注册的通道都会有一个对应的SelectionKey,它包含了通道与选择器之间的关系以及感兴趣的事件类型。 3. NIO工作流程 - 打开通道:例如创建一个FileChannel或...

    用Java实现非阻塞通信

    用Java实现非阻塞通信 java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非...selected-keys集合中,就表示与这个SelectionKey对象相关的事件发生了。

    java HttpServer源码工程

    2. 循环监听Selector,当有新的连接或数据可读时,Selector会返回一个SelectionKey。 3. 处理新连接:创建SocketChannel,将其注册到Selector,监听读事件。 4. 处理数据:读取SocketChannel中的数据到ByteBuffer,...

    java聊天室源码

    - `多路复用I/O`:如Java的`Selector`和`SelectionKey`,可以让服务器在一个线程中同时处理多个客户端连接,提高性能。 - `线程池`:使用`ExecutorService`管理线程,避免频繁创建和销毁线程,优化系统资源。 6. ...

    Netty5.0架构剖析和源码解读

    ### Netty5.0架构剖析和源码解读 #### 1. 概述 ##### 1.1. JAVA的IO演进 ###### 1.1.1. 传统BIO通信的弊端 在JDK 1.4之前,Java网络编程主要依赖于传统的同步阻塞I/O模型(BIO)。这一模型虽然简化了应用程序的...

    Java NIO Selector选择器简介.pdf

    - **SelectionKey**:当一个 Channel 被注册到 Selector 上时,会返回一个 `SelectionKey` 对象,该对象表示了 Channel 与 Selector 之间的关联。通过 `SelectionKey` 可以获取到 Channel 的状态,从而判断是否可以...

    浅谈java中nio的使用方式

    NIO的核心概念包括Channel、Selector、SelectionKey和Buffer。 1. **Channel(通道)**:在NIO中,数据是通过Channel传输的,类似于IO中的InputStream和OutputStream。Channel可以读取和写入数据,并且可以与多种...

    java socket异步长连接demo

    SelectionKey acceptKey = serverSocket.register(selector, SelectionKey.OP_ACCEPT); ``` 客户端则使用`Socket`类建立连接到服务器的通道: ```java Socket socket = new Socket("localhost", 8888); ``` 在...

    java源码:局域网广播系统java源码.rar

    6. **事件驱动编程**:为了实时响应客户端的连接和断开,系统可能会使用Java的I/O多路复用技术,如Selector和SelectionKey,或者采用Java NIO(非阻塞I/O)框架,提高系统的响应速度。 7. **异常处理**:在网络编程...

    基于Java的源码-P2P源码 Azureus 2.5.0.2(JAVA).zip

    理解BitTorrent协议的工作原理,包括Tracker服务器的作用、Torrent文件的结构、Piece Hashing和校验机制,对解析源码至关重要。 3. **网络编程**:Azureus涉及到大量的网络通信,包括TCP/IP套接字编程,如Socket和...

    Java NIO原理解析

    选择器会不断轮询所有注册的通道,当有事件发生时,返回一组`SelectionKey`,通过这些键可以获取触发事件的通道并进行相应操作。 NIO的非阻塞特性使得I/O操作不会阻塞应用程序的执行,当没有数据可读或无法写入时,...

    JAVA代码实现类似C++的SOCKE编程中SELECT的功能。

    Selector可以监控多个Channel(通道),当这些Channel准备好读、写或者有连接到达时,Selector会返回一个包含就绪Channel的`SelectionKey`集合。以下是一个简单的步骤概述: 1. **创建Selector**:首先,我们需要...

    JavaNIO的原理.pdf

    3. 将ServerSocketChannel注册到Selector,指定感兴趣的操作,例如接受连接操作OP_ACCEPT,通过ssc.register(selector, SelectionKey.OP_ACCEPT)。 4. 使用Selector.select()方法进行轮询,获取有事件发生的...

    Java NIO详解及源码下载

    - `SelectionKey`:代表了通道与选择器之间的注册关系,包含了通道的可选操作。 - `Selector.select()`:等待并返回已准备好的通道集合。 - `Channels.newChannel()`:从输入/输出流创建通道。 在学习Java NIO时,...

    tcp nio basics

    client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); while (true) { selector.select(); for (SelectionKey key : selector.selectedKeys()) { if (key.isConnectable()) { // 连接...

Global site tag (gtag.js) - Google Analytics