java selector wakeup_Selector

可以通过调用此类的open方法来创建选择器,该方法将使用系统的默认selector provider来创建新选择器。 还可以通过调用自定义选择器提供程序的openSelector方法来创建选择器。 选择器保持打开状态,直到通过其close方法关闭。

可选择通道的选择器注册由SelectionKey对象表示。 选择器维护三组选择键:

密钥集包含表示此选择器的当前通道注册的键。 该集由keys方法返回。

所选择的密钥集是一组密钥,使得检测到每个密钥的信道准备好用于在先前的选择操作期间在密钥的兴趣集中识别的至少一个操作,该操作在该集合中添加密钥或更新密钥。 选定键集始终是键集的子集。

取消密钥集是已取消但其通道尚未取消注册的密钥集。 此套装无法直接访问。 取消密钥集始终是密钥集的子集。

在新创建的选择器中,所有三个组都是空的。

将一个键添加到选择器的键集,作为通过通道的register方法注册通道的副作用 。 在选择操作期间,取消的密钥将从密钥集中删除。 密钥集本身不能直接修改。

无论是通过关闭其通道还是通过调用其cancel方法,都会在取消选择器的取消键集时添加一个键。 取消密钥将导致其通道在下一个选择操作期间取消注册,此时密钥将从所有选择器的密钥集中删除。

通过选择操作将键添加到选定键集。 可以通过调用set的remove方法或通过调用从该集合获得的iterator的remove方法,直接从所选键集中移除键。 可以通过调用set的clear方法从所选键集中删除所有键。 密钥可能无法直接添加到选定密钥集。

选择

选择操作向底层操作系统查询关于每个注册信道的准备情况的更新,以执行由其密钥的兴趣集标识的任何操作。 选择操作有两种形式:

添加到所选键集的选择操作

在每个选择操作期间,可以将键添加到选择器的选定键组中以及从其中移除键,并且可以从其键和取消键组中移除键。

取消密钥集中的每个密钥将从其所属的每个密钥集中删除,并且其通道被取消注册。 此步骤将取消的密钥设置为空。

查询基础操作系统以获得关于每个剩余信道的准备情况的更新,以执行在其选择操作开始时由其密钥的兴趣集识别的任何操作。 对于已准备好进行至少一个此类操作的通道,将执行以下两个操作之一:

如果通道的密钥不在选择密钥集中,则将其添加到该集合中,并修改其就绪操作集以准确识别现在报告该通道准备就绪的那些操作。 先前记录在就绪集中的任何准备就绪信息都被丢弃。

否则,通道的密钥已经在选择密钥集中,因此修改其就绪操作集以识别报告信道已准备好的任何新操作。 先前记录在就绪集中的任何准备信息都被保留; 换句话说,底层系统返回的就绪集按位顺序分离到密钥的当前就绪集中。 如果在此步骤开始时设置的密钥中的所有密钥都具有空兴趣集,则所选密钥集和任何密钥的就绪操作集都不会更新。

如果在步骤(2)正在进行时将任何键添加到取消键组,则按步骤(1)处理它们。

选择操作是否阻止等待一个或多个通道准备就绪,以及如果等待多长时间,这是三种选择方法之间唯一的本质区别。

对所选键执行操作的选择操作

取消密钥集中的每个密钥将从其所属的每个密钥集中删除,并且其通道被取消注册。 此步骤将取消的密钥设置为空。

查询基础操作系统以获得关于每个剩余信道的准备情况的更新,以执行在其选择操作开始时由其密钥的兴趣集识别的任何操作。

对于一个信道准备好至少一个这样的操作中,准备好操作设定的通道的键的设置,以确定准确的量,信道准备的操作和指定给该动作 select方法被调用来消耗通道的键。 先前记录在就绪集中的任何就绪信息在调用动作之前被丢弃。

或者,在通道准备好进行多个操作的情况下,可以多次调用该动作 ,其中通道的键和就绪操作集被修改为通道准备就绪的操作的子集。 如果对同一个键多次调用该操作,则其就绪操作集永远不会包含在同一选择操作中先前调用该操作时包含在该集中的操作位。

如果在步骤(2)正在进行时将任何键添加到取消键组,则按步骤(1)处理它们。

并发

Selector及其密钥集可安全地供多个并发线程使用。 但是,它的选择键集和取消键集不是。

选择操作按顺序在选择键本集上的选择器本身上同步。 它们还在上面的步骤(1)和(3)期间在取消的密钥集上同步。

在选择操作正在进行时对选择器键的兴趣集所做的更改对该操作没有影响; 它们将在下一次选择操作中看到。

密钥可能会被取消,渠道可能随时关闭。 因此,在一个或多个选择器的密钥集中存在密钥并不意味着密钥有效或其信道是开放的。 如果有可能另一个线程取消密钥或关闭一个通道,应用程序代码应该小心地同步并检查这些条件。

在选择操作中被阻塞的线程可能会被以下三种方式之一的其他线程中断:

通过调用选择器的wakeup方法,

通过调用选择器的close方法,或

通过调用阻塞线程的interrupt方法,在这种情况下,将设置其中断状态,并调用选择器的wakeup方法。

close方法以与选择操作中相同的顺序在选择器及其选择键集上同步。

Selector的密钥集对多个并发线程使用是安全的。 来自密钥集的检索操作通常不会阻塞,因此可能与添加到集合的新注册重叠,或者与从集合中移除密钥的选择操作的取消步骤重叠。 迭代器和分裂器在迭代器/分裂器创建时或之后的某个时刻返回反映集合状态的元素。

通常,选择器的选定密钥集不能安全地供多个并发线程使用。 如果这样的线程可能直接修改集合,则应通过同步集合本身来控制访问。 由set iterator方法返回的迭代器是快速失败的:如果在创建迭代器之后修改了set,除了通过调用迭代器自己的remove方法之外,将抛出ConcurrentModificationException 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值