public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Selector复用的通道 。 
        为了与一个选择器被使用,这个类的一个实例必须首先经由注册 register方法。 此方法返回一个新的SelectionKey对象,表示通道与选择器的注册。 
一旦注册了选择器,通道保持注册,直到它被注销 。 这包括通过选择器取消分配给频道的任何资源。
 渠道不能直接注销; 而是代表其注册的密钥必须被取消 。 取消密钥请求在选择器的下一个选择操作期间注销通道。 可以通过调用其cancel方法来明确地取消密钥。 无论通过调用其close方法还是通过中断通道上的I / O操作中阻塞的线程,通道关闭时,所有通道的密钥都将被隐式取消。 
如果选择器本身被关闭,那么该通道将被注销,并且表示其注册的密钥将被无效,而不再延迟。
任何特定选择器最多可以注册一个通道。
 可以通过调用isRegistered方法来确定信道是否被注册到一个或多个选择器。 
可选择的通道可安全使用多个并发线程。
isBlocking方法来确定 。 
       新创建的可选通道始终处于阻止模式。 非阻塞模式与基于选择器的复用最为有用。 在注册选择器之前,必须将通道置于非阻塞模式,并且在注销之前可能不会返回到阻止模式。
SelectionKey , Selector 
       | Modifier | Constructor and Description | 
|---|---|
| protected  | SelectableChannel()
              初始化此类的新实例。 
             | 
| Modifier and Type | Method and Description | 
|---|---|
| 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()
              返回一个 
             operation set标识该频道支持的操作。 
             | 
begin, close, end, implCloseChannel, isOpenpublic abstract SelectorProvider provider()
public abstract int validOps()
public abstract boolean isRegistered()
由于键取消和通道注销之间的固有延迟,在所有键被取消之后,频道可能会保留一段时间。 通道关闭后也可能会保留一段时间。
public abstract SelectionKey keyFor(Selector sel)
sel - 选择器 
           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 - 如果此频道关闭 
           ClosedSelectorException - 如果选择器关闭 
           IllegalBlockingModeException - 如果此通道处于阻塞模式 
           IllegalSelectorException - 如果此通道不是由与给定选择器相同的提供程序创建的 
           CancelledKeyException - 如果此通道当前已注册到给定的选择器,但相应的键已被取消 
           IllegalArgumentException - 如果 
            ops集合中的某个位与此通道支持的操作不对应,也就是说,如果 
            set & ~validOps() != 0 
           public final SelectionKey register(Selector sel, int ops) throws ClosedChannelException
sel - 要注册该频道的选择器 
           ops - 为结果键设置的兴趣 
           ClosedChannelException - 如果此通道关闭 
           ClosedSelectorException - 如果选择器关闭 
           IllegalBlockingModeException - 如果此通道处于阻塞模式 
           IllegalSelectorException - 如果此通道不是由与给定选择器相同的提供者创建的 
           CancelledKeyException - 如果此通道当前已注册到给定的选择器,但相应的键已被取消 
           IllegalArgumentException - 如果ops中的某位与此频道 
            支持的操作不对应,也就是说,如果 
            set & ~validOps() != 0 
           public abstract SelectableChannel configureBlocking(boolean block) throws IOException
 如果该通道已经被一个或多个选择器注册,则尝试将其置于阻塞模式将导致抛出IllegalBlockingModeException 。 
可以随时调用此方法。 新的阻塞模式将仅影响此方法返回后启动的I / O操作。 对于一些实现,这可能需要阻塞,直到所有待处理的I / O操作完成。
 如果此方法被调用,而此方法或register方法的另一个调用正在进行中,那么它将首先阻止,直到另一个操作完成。 
block - 如果true那么这个通道将被置于阻塞模式; 
            如果false那么它将被放置为非阻塞模式 
           ClosedChannelException - 如果此频道关闭 
           IllegalBlockingModeException - 如果 
            block是 
            true ,并且该通道被注册到一个或多个选择器 
           IOException - 如果发生I / O错误 
           public abstract boolean isBlocking()
如果此通道关闭,则此方法返回的值未指定。
public abstract Object blockingLock()
configureBlocking和register方法同步的对象。 
           这在实现需要在短时间内保持特定阻塞模式的适配器通常是有用的。 
           Submit a bug or feature 
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
 Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.