java.nio.channels
类 SelectionKey

java.lang.Object
  

java.nio.channels.SelectionKey
直接已知子类:
AbstractSelectionKey

public abstract class SelectionKeyextends Object

表示 SelectableChannel 在 Selector 中的注册的标记。

每次向选择器注册通道时就会创建一个选择键。通过调用某个键的 cancel 方法、关闭其通道,或者通过关闭其选择器来取消 该键之前,它一直保持有效。取消某个键不会立即从其选择器中移除它;相反,会将该键添加到选择器的已取消键集,以便在下一次进行选择操作时移除它。可通过调用某个键的 isValid 方法来测试其有效性。

选择键包含两个表示为整数值的操作集。操作集的每一位都表示该键的通道所支持的一类可选择操作。

  • interest 集合 确定了下一次调用某个选择器的选择方法时,将测试哪类操作的准备就绪信息。创建该键时使用给定的值初始化 interest 集合;之后可通过 interestOps(int) 方法对其进行更改。

  • ready 集合 标识了这样一类操作,即某个键的选择器检测到该键的通道已为此类操作准备就绪。创建该键时 ready 集合被初始化为零;可以在之后的选择操作中通过选择器对其进行更新,但不能直接更新它。

选择键的 ready 集合指示,其通道对某个操作类别已准备就绪,该指示只是一个提示,并不保证线程可执行此类别中的操作而不导致被阻塞。ready 集合很可能一完成选择操作就是准确的。ready 集合可能由于外部事件和在相应通道上调用的 I/O 操作而变得不准确。

此类定义了所有已知的操作集位 (operation-set bit),但是给定的通道具体支持哪些位则取决于该通道的类型。SelectableChannel 的每个子类都定义了 validOps() 方法,该方法返回的集合恰好标识该通道支持的操作。试图设置或测试某个键的通道所不支持的操作集位将导致抛出相应的运行时异常。

通常必须将某个特定于应用程序的数据与某个选择键相关联,例如表示高级协议状态的对象和为了实现该协议而处理准备就绪通知的对象。因此,选择键支持将单个任意对象附加 到某个键的操作。可通过 attach 方法附加对象,然后通过 attachment 方法获取该对象。

多个并发线程可安全地使用选择键。一般情况下,读取和写入 interest 集合的操作将与选择器的某些操作保持同步。具体如何执行该同步与实现有关:在一般实现中,如果正在进行某个选择操作,那么读取或写入 interest 集合可能会无限期地阻塞;在高性能的实现中,可能只会暂时阻塞。无论在哪种情况下,选择操作将始终使用该操作开始时当前的 interest 集合值。

从以下版本开始:
1.4
另请参见:
SelectableChannel, Selector

字段摘要
static int OP_ACCEPT           用于套接字接受操作的操作集位。
static int OP_CONNECT           用于套接字连接操作的操作集位。
static int OP_READ           用于读取操作的操作集位。
static int OP_WRITE           用于写入操作的操作集位。
构造方法摘要
protected SelectionKey()           构造此类的一个实例。
方法摘要
 Object attach(Object ob)           将给定的对象附加到此键。
 Object attachment()           获取当前的附加对象。
abstract  void cancel()           请求取消此键的通道到其选择器的注册。
abstract  SelectableChannel channel()           返回为之创建此键的通道。
abstract  int interestOps()           获取此键的 interest 集合。
abstract  SelectionKey interestOps(int ops)           将此键的 interest 集合设置为给定值。
 boolean isAcceptable()           测试此键的通道是否已准备好接受新的套接字连接。
 boolean isConnectable()           测试此键的通道是否已完成其套接字连接操作。
 boolean isReadable()           测试此键的通道是否已准备好进行读取。
abstract  boolean isValid()           告知此键是否有效。
 boolean isWritable()           测试此键的通道是否已准备好进行写入。
abstract  int readyOps()           获取此键的 ready 操作集合。
abstract  Selector selector()           返回为此选择器创建的键。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
字段详细信息

OP_READ

public static final int OP_READ
用于读取操作的操作集位。

假定在选择操作开始时,选择键的 interest 集合中已包含 OP_READ。如果选择器检测到相应的通道已为读取准备就绪、已经到达流的末尾、已经被远程关闭而无法进行进一步的读取,或者有一个挂起的错误,那么它会向该键的 ready 集合中添加 OP_READ,并将该键添加到已选择键集中。

另请参见:
常量字段值

OP_WRITE

public static final int OP_WRITE
用于写入操作的操作集位。

假定在选择操作开始时,选择键的 interest 集合中已包含 OP_WRITE。如果选择器检测到相应的通道已为写入准备就绪、已经被远程关闭而无法进行进一步的写入,或者有一个挂起的错误,那么它会向该键的 ready 集合中添加 OP_WRITE,并将该键添加到已选择键集中。

另请参见:
常量字段值

OP_CONNECT

public static final int OP_CONNECT
用于套接字连接操作的操作集位。

假定在选择操作开始时,选择键的 interest 集合中已包含 OP_CONNECT。如果选择器检测到相应的套接字通道已为完成其连接序列而准备就绪,或者有一个挂起的错误,那么它会向该键的 ready 集合中添加 OP_CONNECT,并将该键添加到已选择键集中。

另请参见:
常量字段值

OP_ACCEPT

public static final int OP_ACCEPT
用于套接字接受操作的操作集位。

假定在选择操作开始时,选择键的 interest 集合中已包含 OP_ACCEPT。如果选择器检测到相应的服务器套接字通道已为接受另一个连接而准备就绪,或者有一个挂起的错误,那么它会向该键的 ready 集合中添加 OP_ACCEPT,并将该键添加到已选择键集中。

另请参见:
常量字段值
构造方法详细信息

SelectionKey

protected SelectionKey()
构造此类的一个实例。
方法详细信息

channel

public abstract SelectableChannel channel()
返回为之创建此键的通道。即使已取消该键,此方法仍继续返回通道。
返回:
此键的通道

selector

public abstract Selector selector()
返回为此选择器创建的键。即使已取消该键后,此方法仍将继续返回选择器。
返回:
此键的选择器

isValid

public abstract boolean isValid()
告知此键是否有效。

键在创建时是有效的,并在被取消、其通道已关闭或者其选择器已关闭之前保持有效。

返回:
当且仅当此键有效时才返回 true

cancel

public abstract void cancel()
请求取消此键的通道到其选择器的注册。一旦返回,该键就是无效的,并且将被添加到其选择器的已取消键集中。在进行下一次选择操作时,将从所有选择器的键集中移除该键。

如果已取消了此键,则调用此方法无效。一旦取消某个键,该键会一直保持无效。

可在任意时间调用此方法。此方法与选择器的已取消键集保持同步,因此如果通过涉及同一选择器的取消或选择操作并发调用它,则它可能会暂时受阻塞。


interestOps

public abstract int interestOps()
获取此键的 interest 集合。

可保证返回的集合仅包含对于此键的通道而言有效的操作位。

可在任意时间调用此方法。是否受阻塞,以及阻塞时间长短都是与实现相关的。

返回:
此键的 interest 集合
抛出:
CancelledKeyException - 如果已取消此键

interestOps

public abstract SelectionKey interestOps(int ops)
将此键的 interest 集合设置为给定值。

可在任意时间调用此方法。是否受阻塞,以及阻塞时间长短都是与实现相关的。

参数:
ops - 新的 interest 集合
返回:
此选择键
抛出:
IllegalArgumentException - 如果集合中的某个位与此键的通道所支持的某个操作不对应,也就是说,如果 set & ~(channel().validOps()) != 0
CancelledKeyException - 如果已取消此键

readyOps

public abstract int readyOps()
获取此键的 ready 操作集合。

可保证返回的集合仅包含对于此键的通道而言有效的操作位。

返回:
此键的 ready 操作集合
抛出:
CancelledKeyException - 如果已取消此键

isReadable

public final boolean isReadable()
测试此键的通道是否已准备好进行读取。

调用此方法的形式为 k.isReadable() ,该调用与以下调用的作用完全相同:

 k.readyOps() & OP_READ != 0

如果此键的通道不支持读取操作,则此方法始终返回 false

返回:
当且仅当 readyOps() & OP_READ 为非零值时才返回 true
抛出:
CancelledKeyException - 如果已取消此键

isWritable

public final boolean isWritable()
测试此键的通道是否已准备好进行写入。

调用此方法的形式为 k.isWritable() ,该调用与以下调用的作用完全相同:

 k.readyOps() & OP_WRITE != 0

如果此键的通道不支持写入操作,则此方法始终返回 false

返回:
当且仅当 readyOps() & OP_WRITE 为非零值时才返回 true
抛出:
CancelledKeyException - 如果已取消此键

isConnectable

public final boolean isConnectable()
测试此键的通道是否已完成其套接字连接操作。

调用此方法的形式为 k.isConnectable() ,该调用与以下调用的作用完全相同:

 k.readyOps() & OP_CONNECT != 0

如果此键的通道不支持套接字连接操作,则此方法始终返回 false

返回:
当且仅当 readyOps() & OP_CONNECT 为非零值时才返回 true
抛出:
CancelledKeyException - 如果已取消此键

isAcceptable

public final boolean isAcceptable()
测试此键的通道是否已准备好接受新的套接字连接。

调用此方法的形式为 k.isAcceptable() 形式,该调用与以下调用的作用完全相同:

 k.readyOps() & OP_ACCEPT != 0

如果此键的通道不支持套接字接受操作,则此方法始终返回 false

返回:
当且仅当 readyOps() & OP_ACCEPT 为非零值时才返回 true
抛出:
CancelledKeyException - 如果已取消此键

attach

public final Object attach(Object ob)
将给定的对象附加到此键。

之后可通过 attachment 方法获取已附加的对象。一次只能附加一个对象;调用此方法会导致丢弃所有以前的附加对象。通过附加 null 可丢弃当前的附加对象。

参数:
ob - 要附加的对象,可以为 null
返回:
先前已附加的对象(如果有),否则返回 null

attachment

public final Object attachment()
获取当前的附加对象。
返回:
当前已附加到此键的对象,如果没有附加对象,则返回 null

SelectionKey API 用法的更多相关文章

  1. Hadoop生态圈-zookeeper的API用法详解

    Hadoop生态圈-zookeeper的API用法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.测试前准备 1>.开启集群 [yinzhengjie@s101 ~] ...

  2. JavaEE基础(02):Servlet核心API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.核心API简介 1.Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener) ...

  3. <自动化测试>之<selenium API 用法2>

    不知道之前的selenium API 用法1,有没有去练习, 个人认为线性代码还是要靠敲的, 后面的模块化除了多敲还需要一定的编程思想去理解, 今天下午不是很忙就给来这儿补充点selenium api ...

  4. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

  5. FFmpeg原始帧处理-滤镜API用法详解

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10429145.html 在FFmpeg中,滤镜(filter)处理的是未压缩的原始音视频 ...

  6. Elasticsearch批量操作API用法介绍

    Elasticsearch的Bulk API允许批量提交index和delete请求,有如下两种用法: 用法1 BulkRequestBuilder requestBuilder = client.p ...

  7. ServerSocketChannel API用法

    java.nio.channels 类 ServerSocketChannel java.lang.Object java.nio.channels.spi.AbstractInterruptible ...

  8. Selector API用法

    java.nio.channels 类 Selector java.lang.Object java.nio.channels.Selector 直接已知子类: AbstractSelector pu ...

  9. Java基础篇(04):日期与时间API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...

随机推荐

  1. Android仿Win8界面的button点击

    今天没事的时候,感觉Win8的扁平化的button还是挺好看的,就研究了下怎样在安卓界面实现Win8的扁平化button点击效果. 发现了一个自己定义的View能够实现扁平化button效果,话不多说 ...

  2. php课程 18-60 cookie和session的最主要区别是什么

    php课程 18-60 cookie和session的最主要区别是什么 一.总结 一句话总结:存储位置不同:cookie存储在客户端:session存储在服务端. 1.cookie和session在p ...

  3. WSDL生成dll

    --生成代理类wsdl /l:cs /n:OAWebService /out:D:OAWebService.cs D:\OAWebService.WSDL--生成dllcsc /out:D:OAWeb ...

  4. echarts tooltip提示框 自定义小圆点(颜色、形状和大小等等)

    项目是拿 echarts + 百度地图 来做可视化界面,现在到收尾阶段慢慢优化. 先附代码: formatter: function(params) { var result = '' params. ...

  5. django 简单会议室预约(6)

    后台完了现在来看前端,前端用了一个bootstrap框架,看起来能好看点 先看一下文件结构:在djapp里创建了两个文件夹templates和static templates里面是要显示的页面,sta ...

  6. 【Uva 11080】Place the Guards

    [Link]: [Description] 一些城市,之间有道路相连,现在要安放警卫,警卫能看守到当前点周围的边,一条边只能有一个警卫看守,问是否有方案,如果有最少放几个警卫. [Solution] ...

  7. Java经典23种设计模式之行为型模式(二)

    本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...

  8. Ubuntu配置图形桌面LXDE和VNC、中文语言包、中文输入法

    Ubuntu配置图形桌面LXDE和VNC.中文语言包.中文输入法 http://www.lijiejie.com/ubuntu-vps-config-lxde-vnc/ LXDE是Ubuntu图形桌面 ...

  9. 非极大值抑制(non-maximum suppression)的理解与实现

    非极大抑制(Non-Maximum Suppression) Non-Maximum Suppression for Object Detection in Python RCNN 和微软提出的 SP ...

  10. HTML基础第八讲---序列卷标

    转自:https://i.cnblogs.com/posts?categoryid=1121494 什么叫做序列卷标?其实,这是一个大家都蛮熟悉的东西,只是在网页中换个名称来称呼罢了,序列卷标的功能在 ...