我创建了一个抽象public interface Channel<R extends SelectableChannel & ReadableByteChannel, W extends SelectableChannel & WritableByteChannel>
对于java.nio.channels.SelectableChannel
,它提供了isBidirectional
方法和吸气剂来检索写/读通道(可能相等也可能不相等)。该通道以及可能的其他多个实例与封装选择器的I / O调度程序一起使用。
由于我想进行非阻塞写入,因此调度程序将应写入到相应通道的ByteBuffer填充到多个队列中,并在需要写入的情况下将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)
是否正确调用?还是应该取出钥匙?
最佳答案
可以调用key.interestOps(0);
是的,这完全可以。