SelectionKey具有空兴趣集

时间:2014-11-25 17:28:03

标签: java select nio socketchannel

我创建了一个抽象

public interface Channel<R extends SelectableChannel & ReadableByteChannel, W extends SelectableChannel & WritableByteChannel>

对于java.nio.channels.SelectableChannel,它提供isBidirectional方法和getter来检索写/读通道(可能相等也可能不相同)。此通道以及可能的多个其他实例与用于封装选择器的i / o调度程序一起使用。

由于我希望进行非阻塞写入,因此调度程序使用ByteBuffers填充多个队列,应将其写入相应的通道并将java.nio.channels.SelectionKey.OP_WRITE添加到密钥的兴趣集中(如果写入到期)

对于双向通道,它是一个简单的更新操作,因为读通道(==写通道), 已经感兴趣地处理OP_READ。 如果通道是单向的,我必须得到写通道(!=读通道)并注册它OP_WRITE


问题

假设现在队列为空,我在执行写操作后该怎么办? 对于双向渠道,我只需将兴趣重置为OP_READ

但是我应该如何处理单向通道,是否可以调用key.interestOps(0);,它不违反方法的不变

(ops & ~channel().validOps()) != 0

(单向)写通道的兴趣集合将为空。


简称

java.nio.channels.SelectionKey.interestOps(0)是否正确调用,如果我目前对选择键不感兴趣?或者我应该删除密钥吗?

2 个答案:

答案 0 :(得分:2)

  

可以调用key.interestOps(0);

是的,这完全没问题。

答案 1 :(得分:0)

这意味着您对该密钥的任何操作都不感兴趣,因此这将重置之前感兴趣的操作。

通过这样做,你告诉选择器现在忽略这个键。