`
稻-草
  • 浏览: 61885 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java NIO 的数据发送空循环导致的CPU暴涨

    博客分类:
  • Java
阅读更多

考虑到性能问题,采用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);
0
0
分享到:
评论
2 楼 xiaofanac66 2015-09-07  
NIO是需要移除监听key的吧  否则一直都会返回TRUE
1 楼 xsbird 2014-03-25  
貌似不注册写,也可以任意写。

相关推荐

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    JavaNIO chm帮助文档

    Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    Java NIO英文高清原版

    Java NIO英文高清原版

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    java NIO.zip

    java NIO.zip

    java nio 读文件

    java nio 读文件,java nio 读文件

    java NIO技巧及原理

    java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    Java NIO测试示例

    Java NIO测试示例

    基于Java NIO实现五子棋游戏.zip

    基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...

    JavaNIO.pdf

    JavaNIO.pdf

    Java NIO.pdf

    java nio编程 非阻塞模式的通信 电子书 带目录标签

    java NIO 的详细介绍文档

    java NIO 的详细介绍文档,javaNIO是从java1.4开始出现的,解决了javaI/O流的复杂度开销,提供了多种简洁高效的I/O操作类

Global site tag (gtag.js) - Google Analytics