【发布时间】:2016-11-10 22:14:24
【问题描述】:
问题的大致轮廓是多线程的 ClientSocketChannel 使用 CPU 超出预期。 一般的东西是具有多线程的ClientSocketChannel。 好的,我应该说我要问的问题之前问过 this question.
还有其他相同答案的帖子。我再次提到它的原因是我真的无法理解答案,因为它并不明显,并且我无法采用我的代码。我试着简单解释一下需求,看看有没有可以涵盖全部需求的答案。
- 写入过程应触发填充另一个线程的字节缓冲区
- 系统必须意识到写入或读取操作,因为它们中的任何一个都可能首先发生。
- 一种防止无用 cpu 运行的方法,似乎 OP_write 在不需要时使其忙碌。
回答:
OP_WRITE的正确使用方法如下:
只为 OP_READ 注册一个新接受的频道
那么我们是只需要一个带有 OP_READ 操作数的通道还是两者都需要(通道 1 OP_READ,通道 2 OP_READ | OP_WRITE)?
当你有东西要写到频道时,就写吧
在代码的哪一部分?
如果该写入返回零,则为 OP_WRITE 注册通道,保存您尝试写入的 ByteBuffer,然后返回选择循环 当 OP_WRITE 在通道上触发时,使用相同的缓冲区调用 write() 如果写入成功并且不返回零,请再次注册 OP_READ,或者至少从 interestOps 中删除 OP_WRITE。
“如果该写入返回零”,据我所知,这意味着没有要写入的字节,那么我为什么要注册 OP_WRITE?
“保存字节缓冲区”:把这个缓冲区作为寄存器的第三个参数是真的吗?像下面这样的?
channel.register(selector, operations, SharedBuffer);
【问题讨论】:
-
对被引用的文本使用引号格式。