有没有一种方法可以取消一个键,这样我以后仍然可以用JavaNIO读取它

有没有一种方法可以取消一个键,这样我以后仍然可以用JavaNIO读取它,java,netty,nio,mina,Java,Netty,Nio,Mina,我们希望将tcp流控制作为新JavaNIO库的主要组件。它会像这样工作 库向Listener.incomingData(DataChunk DataChunk)激发数据 在调用dataChunk.processed()之前,库不会激发更多数据,即使有 通常,您可以在前几个数据块上调用processed()方法,但在某个消息的最后一个数据块上,您将写入某个远程套接字并为其提供回调处理程序 一旦调用了写回调,就可以调用最后一个dataChunk.processed()来再次解除tcp流控制 重要提示

我们希望将tcp流控制作为新JavaNIO库的主要组件。它会像这样工作

  • 库向Listener.incomingData(DataChunk DataChunk)激发数据
  • 在调用dataChunk.processed()之前,库不会激发更多数据,即使有
  • 通常,您可以在前几个数据块上调用processed()方法,但在某个消息的最后一个数据块上,您将写入某个远程套接字并为其提供回调处理程序
  • 一旦调用了写回调,就可以调用最后一个dataChunk.processed()来再次解除tcp流控制

  • 重要提示:如果不从nic缓冲区读取数据,则第2步将自动启动tcp流控制。这是全自动的(我们用JavaNIO进行了测试)。但问题是,我们如何将密钥置于轮询器停止释放并等待除此之外的所有其他套接字上的数据的状态。我不介意它在有新数据时是否释放,因为我们会看到最后一个数据块没有被处理并忽略它,但我们不希望轮询器线程100%循环cpu。是否有一种方法可以实现这一点,这样我们就可以使用这个潜在的开源nio框架为任何服务器实现自动节流。

    否,选择器将查看其内部状态,而不是系统中的事件,因此 设置为感测可读数据,当数据在缓冲区中等待读取时,它将始终返回 被阅读

    你有三个选择

    从缓冲区读取数据并在本地存储,同时等待从上一个块到下一个块 过程

    从选择器中注销密钥,并在处理区块后重新注册

    将键设置为不感知可读,并在处理区块时重置

    我想这就是你想要的,转换阅读兴趣

    selectionKey.interestOps(selectionKey.interestOps() ^ SelectionKey.OP_READ);
    

    只需取消它并稍后重新注册频道,或者只需通过更改其
    interesttops()
    ,将其取消注册为
    OP\u READ,
    ,并在准备再次读取时将其更改回。

    我不知道“否,选择器将查看其内部状态而不是系统事件”的含义,特别是当你剩下的回答是“是”的时候。选择器的全部目的是“从系统中查看事件”。