繁体   English   中英

使用Java NIO进行并发连接

[英]concurrent connection using Java NIO

问题的总体轮廓是带有多线程的ClientSocketChannel使用的CPU超出了预期。 一般的事情是带有多线程的ClientSocketChannel。 好的,我应该说这个问题之前我要问的问题

还有其他帖子具有相同的答案。 我再次提到它的原因是我真的无法理解答案,因为答案不明显,也无法采用我的代码。 我尝试简要解释需求,以查看是否有一个可以涵盖整个需求的答案。

  1. 写过程应使用填充另一个线程的字节缓冲区触发
  2. 系统必须意识到写入或读取操作,因为任何操作都可能首先发生。
  3. 防止不必要的cpu​​运行的方法,这似乎使OP_write在不需要时变得很忙。

回答:

使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM