`
稻-草
  • 浏览: 62771 次
  • 性别: 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.zip

    自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发连接时。NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,与传统的流(Streams)有所不同。 1. **通道...

    JavaNIO chm帮助文档

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

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    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英文高清原版

    NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据量的系统。Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 ...

    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,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

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

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

    一个java NIO的例子

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在传统的Java IO模型中,读写操作是阻塞的,即当调用read或write方法时,线程会等待数据准备好或...

    java NIO详细教程

    Java NIO 支持非阻塞IO模式,这意味着当线程从通道读取数据到缓冲区时,即使没有数据可读,线程也不会被挂起。同样地,当从缓冲区写入数据到通道时,如果通道不可写,线程也不会阻塞。这种非阻塞性质极大地提高了...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输能力,尤其适合于高并发、低延迟的网络应用,如聊天服务器。在这个场景下,...

    NIO与零拷贝_javanio_nio和零拷贝_

    Java NIO(New IO)是Java 1.4引入的一个新特性,它是对传统IO模型的重大改进,提供了更高效的数据处理方式。NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作...

    java nio 读文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的处理I/O操作的方式。NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高...

    Java NIO Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

    Java NIO测试示例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...

Global site tag (gtag.js) - Google Analytics