JAVA NIO的一个关于CONNECT的坑

OP_CONNECT底层实现跟OP_WRITE是一回事,注册OP_CONNECT之后如果不unregister掉OP_CONNECT,select会立即返回0,然后你的程序回进入死循环拉满CPU

这个链接解释得比较清楚
https://stackoverflow.com/questions/9939989/java-nio-selector-select-returns-0-although-channels-are-ready

所以我们要在connect之后调用interestOps重新设置触发事件

channel.configureBlocking(false);
if (!channel.connect(...))
{
    channel.register(sel, SelectionKey.OP_CONNECT, ...); // ... is the attachment, or absent
}
// else channel is connected, maybe register for OP_READ ...
// select() loop runs ...
// Process the ready keys ...
if (key.isConnectable())
{
  if (channel.finishConnect())
  {
     key.interestOps(0); // or SelectionKey.OP_READ or OP_WRITE, whatever is appropriate
  }
}

你很难在JAVA的文档里面找到相关解释,因为这是各个平台的自定义行为,或许在另一个OS里面OP_CONNECT的底层实现跟OP_WRITE不一样,那么就不会存在这个问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容