考虑到性能问题,采用Java NIO作为数据通道。
却发现CPU达 50%,原因是key.isWritable() 基本为ture,导致空循环。
目前还没有想到解决方法。 难到要有数据要写的时候才能注册 Write 事件?
代码摘要如下:
while (!close)
{
// 必须有超时,否者一直锁定,就无法添加、删除连接
selector.select(500);
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while (iter.hasNext())
{
SelectionKey key = iter.next();
iter.remove();
SoftCoSocket softco = (SoftCoSocket) key.attachment();
try
{
if (key.isConnectable())
{
.....
}
else if (key.isReadable())
{
....
}
else if (key.isWritable())
{
// TODO 一直进入这个分支,但是实际发送的数据为空,导致CPU高涨,如何处理?
softco.onWrite(key);
}
}
catch (CancelledKeyException e)
{
close(softco);
}
catch (IOException e)
{
close(softco);
}
}
}
终于找到方法了。
解决方法就是:
1 需要发送数据的时候,注册write事件
channel.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE, this);
2 消息发送完毕后,取消注册write事件
channel.register(selector, SelectionKey.OP_READ, this);