[英]concurrent connection using Java NIO
问题的总体轮廓是带有多线程的ClientSocketChannel使用的CPU超出了预期。 一般的事情是带有多线程的ClientSocketChannel。 好的,我应该说这个问题之前我要问的问题 。
还有其他帖子具有相同的答案。 我再次提到它的原因是我真的无法理解答案,因为答案不明显,也无法采用我的代码。 我尝试简要解释需求,以查看是否有一个可以涵盖整个需求的答案。
回答:
使用OP_WRITE的正确方法如下:
为OP_READ仅注册新接受的频道
那么,我们是否只需要一个具有OP_READ操作数的通道或两个通道(channel1 OP_READ,channel2 OP_READ | OP_WRITE)?
当您有东西要写入通道时,只需将其写入
在代码的哪一部分?
如果该写入返回零,则为OP_WRITE注册该通道,保存您尝试写入的ByteBuffer,然后返回到选择循环。当OP_WRITE在该通道上触发时,如果写入成功但没有成功,则使用相同的缓冲区调用write()返回零,再次注册OP_READ,或至少从interestOps中删除OP_WRITE。
据我所知,“如果该写入返回零”,则意味着没有字节要写入,那么为什么要注册OP_WRITE?
“保存字节缓冲区”:将这个缓冲区作为寄存器的第三个参数是否正确? 像下面的东西?
channel.register(selector, operations, SharedBuffer);
写过程应使用填充另一个线程的字节缓冲区触发
为什么? 另一个线程可以执行实际的写操作。 您不需要“触发”任何东西。
系统必须意识到写入或读取操作,因为任何操作都可能首先发生。
没问题。
防止不必要的cpu运行的方法,这似乎使OP_write在不需要时变得很忙。
正确。 OP_WRITE几乎总是准备就绪,因此当您没有待写入的未完成数据已失败时使用它会浪费CPU。
那么,我们是否只需要一个具有OP_READ操作数的通道或两个通道(channel1 OP_READ,channel2 OP_READ | OP_WRITE)?
您只需要一个频道。
在代码的哪一部分?
在知道它的部分中有东西要写。
据我所知,“如果该写入返回零”,则意味着没有字节要写入,
不,不是。 请参阅Javadoc。 这意味着什么也没写 。 如果没有“要写入的字节”,那么您将不会首先调用write()
。
那为什么要注册OP_WRITE?
这样一来,您就可以得知频道何时可写。
“保存字节缓冲区”:将这个缓冲区作为寄存器的第三个参数是否正确? 像下面的东西?
是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.