public abstract class Selector extends Object implements Closeable
SelectableChannel
对象。
一个选择器可以通过调用该类的open
方法创建的,它将使用系统默认的selector provider
创建一个新的选择。一个选择器也可以通过调用一个自定义选择供应商的openSelector
方法创建。选择保持开放,直到通过close
方法。
一个选择器选择频道的注册是一SelectionKey
对象表示。选择器保持三组选择键:
的按键设置包含代表当前信道注册这个选择器的钥匙。这一套是由keys
方法返回。
是的选择键集键,检测可以在事先选择运行时设置在关键的利益确定操作至少一个每个关键的通道设置。这一套是由selectedKeys
方法返回。所选择的密钥集始终是密钥集的子集。
的取消键集是被取消的渠道,但尚未注销键集。此设置没有直接访问。已取消的密钥集始终是密钥集的子集。
在一个新创建的选择器中,所有三个集合都是空的。
关键是添加到选择器的按键设置为注册通道,通过通道的register
方法的副作用。在选择操作期间从键集合中删除的键。关键的设置本身不直接修改。
关键是添加到选择器的取消键时取消,是否关闭其通道或通过调用其cancel
方法。取消键会导致其渠道将会注销下选择操作期间,同时重点将从所有选择的关键集删除。
通过选择操作将键添加到所选的键集上。一个关键的可以直接从选定的密钥集通过调用设置的remove
方法或通过调用从得到的一iterator
的remove
法去除。键永远不会从所选的键集合中移除任何其他方式;它们不是,特别是移除作为选择操作的副作用。键可能不直接添加到所选的键集上。
在每个选择操作期间,可以从选择器选择的键组中添加和删除键,并从它的键和取消键集合中移除。选择是由select()
,select(long)
进行,和selectNow()
方法,和包括三个步骤:
在取消键设置每个关键是从每一组关键成员的删除,其渠道注销。此步骤将取消的键设置空。
底层操作系统被查询到一个更新,以准备每个剩余的信道执行任何由它的键的兴趣集确定的操作的一刻,选择操作开始。对于已准备至少一个这样的操作的信道,执行以下两个动作之一:
如果信道的密钥已经不在选定的密钥集,那么它被添加到该集和它的准备操作集被修改,以确定正是这些操作的渠道,现在据报道,准备。预先记录在准备就绪组中的任何准备就绪信息都被丢弃。
否则,通道的键已经在选定的键集,所以它的准备操作集被修改,以确定任何新的操作,该通道已准备就绪。任何准备信息预先记录在准备保存;换句话说,在准备返回底层系统是按位分为关键的准备。
如果任何键被添加到取消键集,而步骤(2)在进行中,然后他们被处理的步骤(1)。
是否选择操作块等待一个或多个信道准备就绪,如果是这样的话,是唯一的三种选择方法之间的唯一本质区别。
选择自己的安全,使用多个并发线程;他们的钥匙套,然而,不。
选择操作在键集上和在该顺序上的选定键集上的选择器本身上同步。在步骤(1)和(3)以上的步骤()中,他们也同步对被取消的键进行同步。
在选择操作时,在一个选择器的键的兴趣集上的变化没有对该操作的影响;他们将被视为下一个选择操作。
键可能被取消,信道可能在任何时候被关闭。因此,在一个或多个选择器的关键组中的一个或多个键的存在并不意味着该密钥是有效的,或者它的信道是开放的。应用程序代码应小心同步,并检查这些条件是否必要,如果有任何可能性,另一个线程将取消一个键或关闭一个通道。
一个线程阻塞的一个select()
或select(long)
方法可以被其他线程的三种方式中的一种:
的close
方法同步的选择和所有的三个关键设置在相同的顺序在选择操作。
选择器的键和选定的键集一般不使用多个并发线程使用的安全性。如果这样的一个线程可能会修改这些设置的一个直接然后访问应控制在设置本身同步。迭代器返回的这些集iterator
方法快速失败:如果集合在迭代器创建修改,以任何方式除了通过调用迭代器的remove
方法,然后ConcurrentModificationException
将抛出。
SelectableChannel
,
SelectionKey
Modifier | Constructor and Description |
---|---|
protected |
Selector()
初始化该类的一个新实例。
|
Modifier and Type | Method and Description |
---|---|
abstract void |
close()
关闭此选择器。
|
abstract boolean |
isOpen()
告诉是否这个选择器是打开的。
|
abstract Set<SelectionKey> |
keys()
返回这个选择器的键集。
|
static Selector |
open()
打开选择器。
|
abstract SelectorProvider |
provider()
返回创建此通道的提供程序。
|
abstract int |
select()
选择一组键,其相应的信道为I / O操作准备好。
|
abstract int |
select(long timeout)
选择一组键,其相应的信道为I / O操作准备好。
|
abstract Set<SelectionKey> |
selectedKeys()
返回此选择器选择的键集。
|
abstract int |
selectNow()
选择一组键,其相应的信道为I / O操作准备好。
|
abstract Selector |
wakeup()
导致尚未返回立即返回的第一个选择操作。
|
public static Selector open() throws IOException
新的选择是由调用openSelector
方法的默认SelectorProvider
对象。
IOException
如果I/O错误发生
public abstract boolean isOpen()
public abstract SelectorProvider provider()
public abstract Set<SelectionKey> keys()
关键是不能直接修改。关键是只有在它被取消了,其渠道已注销删除。任何试图修改键设置将导致UnsupportedOperationException
被。
关键是not thread-safe。
ClosedSelectorException
-如果这选择是封闭的
public abstract Set<SelectionKey> selectedKeys()
键可以从,但不是直接添加到选定的键集。任何试图添加一个对象的键将导致UnsupportedOperationException
被。
选择的关键是not thread-safe。
ClosedSelectorException
-如果这选择是封闭的
public abstract int selectNow() throws IOException
此方法执行非阻塞selection operation。如果没有信道已成为可选择的,因为以前的选择操作,然后这个方法立即返回零。
调用此方法清除以前的任何调用的wakeup
效果的方法。
IOException
如果I/O错误发生
ClosedSelectorException
-如果这选择是封闭的
public abstract int select(long timeout) throws IOException
此方法执行阻塞selection operation。它的回报只有在至少一个通道的选择,这个选择的wakeup
方法被调用时,当前线程被中断,或指定超时时间到期,以先到者为准。
该方法不提供实时保证:它的时间表超时如果通过调用Object.wait(long)
方法。
timeout
如果阳性,达
timeout毫秒块,更多或更少,在等待就绪的通道;如果是零,无限期的阻塞;不得为负
IOException
如果I/O错误发生
ClosedSelectorException
-如果这选择是封闭的
IllegalArgumentException
-如果超时参数的值是负的
public abstract int select() throws IOException
此方法执行阻塞selection operation。它的回报只有在至少一个通道的选择,这个选择的wakeup
方法被调用,或者当前线程被中断,以先到者为准。
IOException
如果I/O错误发生
ClosedSelectorException
-如果这选择是封闭的
public abstract Selector wakeup()
如果另一个线程正在封锁在一个调用的select()
或select(long)
方法然后调用将立即返回。如果不选择手术是目前在进步的话,这些方法之一的下一个调用将立即返回,除非selectNow()
方法同时调用。在任何情况下,调用返回的值都可能是非零的。随后的select()
或select(long)
方法调用将块像往常一样,除非这方法的同时再调用。
调用此方法不止一次在两个连续的选择操作之间有相同的效果,调用它只是一次。
public abstract void close() throws IOException
如果一个线程正在一个这个选择器的选择方法,然后中断如果通过调用选择器的wakeup
方法阻断。
任何与此相关的键选择器还未失效,他们的渠道是注销,以及任何与此相关的其他资源发布选择器。
如果这个选择器已经关闭,则调用该方法没有效果。
后一个选择是封闭的,任何进一步的尝试使用它,除非调用该方法或wakeup
方法,会导致ClosedSelectorException
被。
close
接口
Closeable
close
接口
AutoCloseable
IOException
如果I/O错误发生
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.