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回答

翔仔

2019-06-21

同学好,是说一旦有请求后

就会一直循环while (iterator.hasNext()) 

然后会一直执行

if (key.isAcceptable())

判断然后去等待客户端输入吗?咱们有一个 iterator.remove();
应该会把ready的key给移除以防重复执行,同学可否提供一下你整体的调用代码?

此种情况的话建议同学尝试每次处理完成后sleep一段时间,让出cpu以供其他需要的线程调用。如果此时没有别的线程执行,则让CPU空跑也没没太大问题的。

0
4
翔仔
回复
BlackPearl_B
同学加油:)
2019-06-21
共4条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8463 学习 · 1872 问题

查看课程