我创建了一个抽象

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);


是的,这完全可以。

09-18 22:11