SelectableChannel API 用法

java.nio.channels

类 SelectableChannel

java.lang.Object
  java.nio.channels.spi.AbstractInterruptibleChannel
      java.nio.channels.SelectableChannel
所有已实现的接口:
Closeable, Channel, InterruptibleChannel
直接已知子类:
AbstractSelectableChannel

public abstract class SelectableChannel
extends AbstractInterruptibleChannel
implements Channel

可通过 Selector 实现多路复用的通道。

为了与选择器一起使用,此类的实例必须首先通过 register 方法进行注册。此方法返回一个表示该通道已向选择器注册的新 SelectionKey 对象。

向选择器注册后,通道在注销 之前将保持注册状态。注销涉及释放选择器已分配给该通道的所有资源。

不能直接注销通道;相反,必须取消 表示通道注册的键。取消某个键要求在选择器的下一个选择操作期间注销通道。可通过调用某个键的 cancel 方法显式地取消该键。无论是通过调用通道的 close 方法,还是中断阻塞于该通道上 I/O 操作中的线程来关闭该通道,都会隐式地取消该通道的所有键。

如果选择器本身已关闭,则将注销该通道,并且表示其注册的键将立即无效。

一个通道至多只能在任意特定选择器上注册一次。

可通过调用 isRegistered 方法来确定是否向一个或多个选择器注册了某个通道。

多个并发线程可安全地使用可选择的通道。

阻塞模式

可选择的通道要么处于阻塞 模式,要么处于非阻塞 模式。在阻塞模式中,每一个 I/O 操作完成之前都会阻塞在其通道上调用的其他 I/O 操作。在非阻塞模式中,永远不会阻塞 I/O 操作,并且传输的字节可能少于请求的数量,或者可能根本不传输字节。可通过调用可选择通道的 isBlocking 方法来确定其阻塞模式。

新创建的可选择通道总是处于阻塞模式。在结合使用基于选择器的多路复用时,非阻塞模式是最有用的。向选择器注册某个通道前,必须将该通道置于非阻塞模式,并且在注销之前可能无法返回到阻塞模式。

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

构造方法摘要
protected
SelectableChannel()           初始化此类的一个新实例。
方法摘要
abstract  Object blockingLock()           获取其 configureBlocking 和 register 方法实现同步的对象。
abstract  SelectableChannel configureBlocking(boolean block)           调整此通道的阻塞模式。
abstract  boolean isBlocking()           判断此通道上的每个 I/O 操作在完成前是否被阻塞。
abstract  boolean isRegistered()           判断此通道当前是否已向任何选择器注册。
abstract  SelectionKey keyFor(Selector sel)           获取表示通道向给定选择器注册的键。
abstract  SelectorProvider provider()           返回创建此通道的提供者。
 SelectionKey register(Selector sel, int ops)           向给定的选择器注册此通道,返回一个选择键。
abstract  SelectionKey register(Selector sel, int ops, Object att)           向给定的选择器注册此通道,返回一个选择键。
abstract  int validOps()           返回一个操作集,标识此通道所支持的操作。
从类 java.nio.channels.spi.AbstractInterruptibleChannel 继承的方法
begin, close, end, implCloseChannel, isOpen
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
构造方法详细信息

SelectableChannel

protected SelectableChannel()
初始化此类的一个新实例。

方法详细信息

provider

public abstract SelectorProvider provider()
返回创建此通道的提供者。

返回:
创建此通道的提供者

validOps

public abstract int validOps()
返回一个操作集,标识此通道所支持的操作。此整数值中设置的各位正好表示对此通道有效的操作。对于给定的具体通道类,此方法始终返回相同的值。

返回:
有效操作集

isRegistered

public abstract boolean isRegistered()
判断此通道当前是否已向任何选择器注册。新创建的通道总是未注册的。

由于键取消和通道注销之间固有的延迟,所以在已取消某个通道的所有键后,该通道可能在一定时间内还会保持已注册状态。关闭通道后,该通道可能在一定时间内还会保持已注册状态。

返回:
当且仅当此通道为已注册时才返回 true

keyFor

public abstract SelectionKey keyFor(Selector sel)
获取表示通道向给定选择器注册的键。

返回:
当此通道是向给定选择器注册的最后一个通道时返回该键,如果此通道当前未向该选择器注册,则返回 null

register

public abstract SelectionKey register(Selector sel,
                                      int ops,
                                      Object att)
                               throws ClosedChannelException
向给定的选择器注册此通道,返回一个选择键。

如果当前已向给定的选择器注册了此通道,则返回表示该注册的选择键。该键的相关操作集将更改为 ops,就像调用 interestOps(int) 方法一样。如果
att 参数不为 null,则将该键的附件设置为该值。如果已取消该键,则抛出 CancelledKeyException。

如果尚未向给定的选择器注册此通道,则注册该通道并返回得到的新键。该键的初始可用操作集是 ops,并且其附件是 att

可在任意时间调用此方法。如果调用此方法的同时正在进行另一个此方法或 configureBlocking 方法的调用,则在另一个操作完成前将首先阻塞该调用。然后此方法将在选择器的键集上实现同步,因此如果调用此方法时并发地调用了涉及同一选择器的另一个注册或选择操作,则可能阻塞此方法的调用。

如果正在进行此操作时关闭了此通道,则此方法返回的键是已取消的,因此返回键无效。

参数:
sel - 要向其注册此通道的选择器
ops - 所得键的可用操作集
att - 所得键的附件,可能为 null
返回:
表示此通道向给定选择器注册的键
抛出:
ClosedChannelException - 如果此通道已关闭
IllegalBlockingModeException - 如果此通道处于阻塞模式
IllegalSelectorException - 如果此通道与给定的选择器不是由相同的提供者创建的
CancelledKeyException - 如果此通道当前已向给定的选择器注册,但是相应的键已经被取消
IllegalArgumentException - 如果 ops 集的某个位不对应于此通道所支持的某个操作,也就是说,如果
set & ~validOps() != 0

register

public final SelectionKey register(Selector sel,
                                   int ops)
                            throws ClosedChannelException
向给定的选择器注册此通道,返回一个选择键。

调用此便捷方法的形式为

sc.register(sel, ops)

与下列方法调用完全相同:

sc.register(sel, ops, null)

参数:
sel - 要向其注册此通道的选择器
ops - 所得键的可用操作集
返回:
表示此通道向给定选择器注册的键
抛出:
ClosedChannelException - 如果此通道已关闭
IllegalBlockingModeException - 如果此通道处于阻塞模式
IllegalSelectorException - 如果此通道与给定的选择器不是由相同的提供者创建的
CancelledKeyException - 如果此通道当前已向给定的选择器注册,但是相应的键已经被取消
IllegalArgumentException - 如果 ops 集的某个位不对应于此通道所支持的某个操作,也就是说,如果
set & ~validOps() != 0

configureBlocking

public abstract SelectableChannel configureBlocking(boolean block)
                                             throws IOException
调整此通道的阻塞模式。

如果向一个或多个选择器注册了此通道,则尝试将此通道置于阻塞模式将导致抛出 IllegalBlockingModeException。

可在任意时间调用此方法。新的阻塞模式仅影响在此方法返回后发起的 I/O 操作。对于某些实现而言,这可能需要在所有挂起的 I/O 操作完成之前阻塞其他操作。

如果调用此方法的同时正在进行另一个此方法或 register 方法的调用,则在另一个操作完成前将首先阻塞该调用。

参数:
block - 如果为 true,则此通道将被置于阻塞模式;如果为 false,则此通道将被置于非阻塞模式
返回:
此可选择通道
抛出:
ClosedChannelException - 如果此通道已关闭
IllegalBlockingModeException - 如果 blocktrue 并且此通道已向一个或多个选择器注册
IOException - 如果发生 I/O 错误

isBlocking

public abstract boolean isBlocking()
判断此通道上的每个 I/O 操作在完成前是否被阻塞。新创建的通道总是处于阻塞模式。

如果此通道已关闭,则此方法返回的值是未指定的。

返回:
当且仅当此通道处于阻塞模式时才返回 true

blockingLock

public abstract Object blockingLock()
获取其 configureBlocking 和 register 方法实现同步的对象。在要求在短时间内维持特定阻塞模式的适配器实现中,这通常是很有用的。

返回:
阻塞模式锁定对象

SelectableChannel类似用法

时间: 2024-11-10 16:19:43

SelectableChannel API 用法的相关文章

HTML5 Canvas八大核心技术及其API用法

什么是canvas? Canvas元素是HTML5的一部分,允许脚本语言动态渲染 位图像.Canvas由一个可绘制区域HTML代码中的属性定义高度和宽度(注:用其属性width和height设置宽度和高度时不能跟像素单位 “px”).JavaScript代码可访问该区域,通过一套完整的绘图功能类似于其他通用二维的API,从而生成动态的图形. Canvas八大核心技术(3D3R公司创始人兼CEO Ohad Eder-Pressman的独到见解): 1.游戏 HTML5在基于Web的图像显示方面比F

Java操作mongoDB2.6的常见API用法

对于mongoDB而言,学习方式和学习关系型数据库差不太多 开始都是学习如何insert.find.update.remove,然后就是分页.排序.索引,再接着就是主从复制.副本集.分片等等 最后就是通过它提供的各个驱动(比如Java.PHP.node.js等等)来练习所谓的高级用法 另外:相对于Oracle有PLSQL Developer,MySQL有HeidiSQL mongoDB也不例外,它的图形化工具中有一款叫做mongoVUE的,我用的是1.5.3破解版(不是每15天就得改一次注册表的

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

摘自:https://www.cnblogs.com/cicada-smile/p/12020195.html 本文源码:GitHub·点这里 || GitEE·点这里 一.核心API简介 1.Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener),它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:接收请求数据:处理请求:完成响应. 2.核心API简介 API

ServerSocketChannel API用法

java.nio.channels 类 ServerSocketChannel java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.SelectableChannel java.nio.channels.spi.AbstractSelectableChannel java.nio.channels.ServerSocketChannel 所有已实现的接口: Closeable,

SelectionKey API 用法

java.nio.channels 类 SelectionKey java.lang.Object java.nio.channels.SelectionKey 直接已知子类: AbstractSelectionKey public abstract class SelectionKeyextends Object 表示 SelectableChannel 在 Selector 中的注册的标记. 每次向选择器注册通道时就会创建一个选择键.通过调用某个键的 cancel 方法.关闭其通道,或者通过

Android Preference API 用法--ListPreference(一)

一.ListPreference简介 我们都只知道SharedPreference非常适合于参数设置功能,在此处的preference 也是代表SharedPreference的意思,在SharedPreference中,我们可以迅速的将某些值保存进xml文件中,然后我们可以读取这些设置信息进行相应的操作. 为了简化与preference相关的应用开发,android为我们提供了一系列的api来帮助我们.主要有 PreferenceActivity,CheckBoxPreference,Edit

Elasticsearch批量操作API用法介绍

Elasticsearch的Bulk API允许批量提交index和delete请求,有如下两种用法: 用法1 BulkRequestBuilder requestBuilder = client.prepareBulk(); for(Person person : personList){ String obj = getIndexDataFromHotspotData(person); if(obj != null){ requestBuilder.add(client.prepareInd

Java 8新特性stream API用法总结

前言 Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data

SocketChannel API用法

java.nio.channels 类 SocketChannel java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.SelectableChannel java.nio.channels.spi.AbstractSelectableChannel java.nio.channels.SocketChannel 所有已实现的接口: Closeable, ByteChannel