我创建了一个抽象
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)
是否正确调用,如果我目前对选择键不感兴趣?或者我应该删除密钥吗?
答案 0 :(得分:2)
可以调用
key.interestOps(0);
是的,这完全没问题。
答案 1 :(得分:0)
这意味着您对该密钥的任何操作都不感兴趣,因此这将重置之前感兴趣的操作。
通过这样做,你告诉选择器现在忽略这个键。