SelectionKey API 用法
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()) != 0CancelledKeyException- 如果已取消此键
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 用法的更多相关文章
- Hadoop生态圈-zookeeper的API用法详解
Hadoop生态圈-zookeeper的API用法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.测试前准备 1>.开启集群 [yinzhengjie@s101 ~] ...
- JavaEE基础(02):Servlet核心API用法详解
本文源码:GitHub·点这里 || GitEE·点这里 一.核心API简介 1.Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener) ...
- <自动化测试>之<selenium API 用法2>
不知道之前的selenium API 用法1,有没有去练习, 个人认为线性代码还是要靠敲的, 后面的模块化除了多敲还需要一定的编程思想去理解, 今天下午不是很忙就给来这儿补充点selenium api ...
- TensorFlow Keras API用法
TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...
- FFmpeg原始帧处理-滤镜API用法详解
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10429145.html 在FFmpeg中,滤镜(filter)处理的是未压缩的原始音视频 ...
- Elasticsearch批量操作API用法介绍
Elasticsearch的Bulk API允许批量提交index和delete请求,有如下两种用法: 用法1 BulkRequestBuilder requestBuilder = client.p ...
- ServerSocketChannel API用法
java.nio.channels 类 ServerSocketChannel java.lang.Object java.nio.channels.spi.AbstractInterruptible ...
- Selector API用法
java.nio.channels 类 Selector java.lang.Object java.nio.channels.Selector 直接已知子类: AbstractSelector pu ...
- Java基础篇(04):日期与时间API用法详解
本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...
随机推荐
- Chormium线程模型及应用指南
核心概念 设计上遵循以下原则: 1 不要在UI线程做不论什么堵塞式的I/O操作,以及其他耗时的操作,通过消息传递把各种操作传给相应用途的线程去做. 2 不鼓舞线程加锁机制和线程安全对象. 对象仅仅存在 ...
- Math的三个取整方法。
Math类中提供了三个与取整有关的方法:ceil.floor.round,这些方法的作用与它们的英文名称的含义相对应 1.ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(1 ...
- Filebeat的下载(图文讲解)
第一步:进入Elasticsearch的官网 https://www.elastic.co/ 第二步:点击downloads https://www.elastic.co/downloads 第三步: ...
- 可重入锁ReentrantLock--转载
突然被问到什么是可重入锁?脑袋里闪过了n中概念,最终没有找到,从网上学习一下. 原文地址:https://www.ibm.com/developerworks/cn/java/j-jtp10264/ ...
- 优秀Java程序员必备10招
1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 ObjectOriented Programming(面向对象编程)这一概念是必须的.没有 OOPS 的坚实基础,就领会不 ...
- kibana中信息分类查询显示的方法
1.什么是kibana? kibana是ELK(elasticsearch+logstash+kibana)中的K,它是一个可灵活的分析和可视化平台,主要是显示数据以及根据这些数据绘出一些可视化图表, ...
- 3.实战HTML+CSS布局(实例入门篇)
转自:https://www.cnblogs.com/hmyprograming/archive/2012/03/23/2414373.html 学习这篇入门教程我们假定你已经具有了一定的HTML基础 ...
- 1.10 Python基础知识 - 序列:列表
在Python中有很多的组合数据类型,其中包括列表,元组,字符串等数据类型,这些数据类型统称为序列类型,用他们可以处理复杂的数据. 列表,是一组有序元素组合的数据结构.列表是可变的数据类型. 列表采用 ...
- 洛谷 P2069 松鼠吃果子
P2069 松鼠吃果子 题目描述 有N个一种松鼠喜欢吃的果子由下向上串排成一列,并标号1,2,...N.一只松鼠从最下果子开始向上跳,并且第i次跳可以一次跳过i*i*i除以5的余数+1个果子(=i*i ...
- 黑马day01 xml 的解析方式
XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...