NIOPainEchoServer中轮询的问题
来源:10-7 Java的IO机制
BlackPearl_B
2019-06-20
翔仔哥,我在测试NIOPainEchoServer类时,当第一层循环进入开始阻塞等待就绪的channel,这里会停留在
// 阻塞等待就绪的Channel,即没有与客户端建立连接前就一直轮询
selector.select();
这里,只要有一个客户端连接进来,就会走向下边的处理key处理,但之后就会一直循环,一直进
// 若SelectedKey处于可写状态
if (key.isWritable()) {
System.out.println("Socket Write......");
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer output = (ByteBuffer) key.attachment();
output.flip();
// 将ByteBuffer里的数据写入到channel里
client.write(output);
output.compact();
}
我观察了下,这样的轮询导致CPU占用率一直在40%徘徊,这种问题该如何优化呢?
写回答
1回答
-
同学好,是说一旦有请求后
就会一直循环while (iterator.hasNext())
然后会一直执行
if (key.isAcceptable())
判断然后去等待客户端输入吗?咱们有一个 iterator.remove();
应该会把ready的key给移除以防重复执行,同学可否提供一下你整体的调用代码?此种情况的话建议同学尝试每次处理完成后sleep一段时间,让出cpu以供其他需要的线程调用。如果此时没有别的线程执行,则让CPU空跑也没没太大问题的。
042019-06-21
相似问题