`
ahua186186
  • 浏览: 562036 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

请您先登录,才能继续操作

java NIO的讨论

 
阅读更多
1.优点:NIO框架性能表现得好与坏,更多的是作者在一些细节方面的处理。

NIO框架其实内部的核心实现都差不多, 比如在Server端通常开有Acceptor和Poller线程,
Acceptor负责接收请求,得到一个Socket后把它包装一下,比如放到一个Task中,然后再把Task加到一个Queue,
Poller说白了就是在不停的执行一个循环,在这个循环中处理各种Task,Task除了Acceptor新注册的任务外,当然还有读和写。

比如在读写字节时尽量减少来回copy,这方面一些成熟的框架都做得很好了,
比如Tomcat、Jetty、Netty在从Socket中读取字节时一般都自已实现了一套Buffer类来对字节数组进行操作,
而不是直接使用java.nio中的Buffer类,
如果想从Buffer中抽取一个片段(比如在http协议解析中,一个请求行有method,uri,http-version),
只要把offset和片段length记下来就行了。


另一个就是并发问题了,尽量减少不必要的同步,

比如像上面的Queue就是一个很关键的地方,这个地方一般会有三种线程在对它操作,
1. Acceptor把接收到的Socket包装成Task加到Queue(执行Queue.offer)
2. 应用线程要写数据,所以WriteTask也会加到Queue(执行Queue.offer)
3. Poller从Queue中取出Task来执行(执行Queue.poll)

所以这个Queue的实现就很重要了,
Netty的聪明之处在于,它没有使用java.util.concurrent中的Queue实现(比如ArrayBlockingQueue或ConcurrentLinkedQueue),
而是使用Doug Lea大神在jdk1.7中才加入的jsr166y.LinkedTransferQueue,
在Netty中变成了org.jboss.netty.util.internal.LinkedTransferQueue,这两个类有一点点差异,
我无法确认是Trustin Lee自己修改的,还是用了不同版本。

jsr166y.LinkedTransferQueue威力不容忽视,Tomcat、Jetty、Mina都没使用,
如果你刚好又用过BoneCP(一个JDBC数据库链接池框架),它也用了jsr166y.LinkedTransferQueue来对链接进行offer和poll操作,
BoneCP的测试报告出来了(http://jolbox.com/),比DBCP、C3P0快20多倍。

2.缺点:
Netty的一个缺点,
大家看到这,发现我都没有提到读数据的情况,Netty读数据也是用Poller线程在读,
不管Acceptor放入多少个Socket,全是Poller线程在一个个地读,
把读到的数据放到Buffer后会触发MessageEvent事件(Netty是一个纯正的事件驱动框架,这是Tomcat、Jetty这类业余选手望尘莫及的),
此时会调用ChannelUpstreamHandler这类处理器的messageReceived方法,
messageReceived方法中的代码通常是业务相关的,但是执行messageReceived方法的线程却是Poller线程,
所以只要在messageReceived这种地方出现问题,比如有个Thead.sleep调用或者出现无限循环,
那么此时Netty跟死了没分别,Poller线程无法往下走了,所有Task都没法处理了
分享到:
评论

相关推荐

    Java.NIO资源下载资源下载

    根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...

    Java语言基础教程-Java NIO流篇2

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,是对传统IO模型的补充和扩展。本教程将深入讲解Java NIO中的流和通道概念,以帮助开发者更好地理解和利用这一强大的功能。 首先,我们要理解Java NIO的核心组件...

    Java NIO 英文文字版

    书的目录包括引言、组织结构、目标读者、软件和版本、本书中的约定、如何联系我们、致谢,以及后续章节对各个主题的详细讨论,如NIO的介绍、基本概念、缓冲区、通道、选择器、字符集处理、文件操作和正则表达式的...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    Java NIO(New Input/Output)是Java提供的一种新的输入输出处理机制,...对于完整的NIO知识体系,开发者还需要参考Java官方文档中的其他部分,以及可能的第三方教材和专业社区讨论,以便能够深入理解和掌握Java NIO。

    非GUI聊天室基于javaNIO

    服务端程序基于javaNIO,客户端程序基于旧IO,读完<<javaNIO>>后,导入eclipse即可运行,支持多人在线聊天,上下线通知.PS:非GUI程序,毕竟javaSwing用的少,不懂的地方大家可以一起讨论,评论必回!

    java-nio.rar_java nio_nio 对象实例化

    下面我们将详细讨论NIO中的核心对象及其实例化方法。 1. **通道(Channel)**:通道是NIO的核心组件之一,它代表了一个打开的I/O连接,可以用于读取数据到内存或者从内存写入数据。例如,FileChannel用于文件操作,...

    JavaNIO服务器实例Java开发Java经验技巧共6页

    本资料"JavaNIO服务器实例Java开发Java经验技巧共6页"可能是某个Java开发者或讲师分享的一份关于如何在Java中构建NIO服务器的教程,涵盖了6个关键页面的内容。尽管具体的细节无法在此直接提供,但我们可以根据Java ...

    ffc.zip_FileCopy_NIO_java nio

    标题“ffc.zip_FileCopy_NIO_java nio”表明我们将讨论如何使用Java NIO进行快速的文件复制,特别是针对文本文件的情况。 在Java的传统IO模型中,我们通常使用`InputStream`和`OutputStream`进行数据读写,这种方式...

    Java NIO 国外 PPT 课件(精华)

    Utah Java User Group(犹他州Java用户组)可能在其中讨论了NIO的基本概念,如选择器(Selectors)、通道(Channels)和缓冲区(Buffers),这些都是NIO的关键组件。选择器允许单线程处理多个通道,极大地提高了并发性能;...

    Java NIO原理和使用

    本文主要简单介绍NIO的基本原理,在下一篇文章中,将结合Reactor模式和著名线程大师Doug Lea的一篇文章深入讨论。 NIO主要原理和适用。 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的...

    Java NIO.pdf

    - **NIO 和 JNI**:讨论了 Java Native Interface (JNI) 如何与 NIO 配合使用,以及它们之间的交互方式。 - **快速参考**:提供了 NIO 相关类和接口的简明列表,方便快速查找和参考。 以上内容总结了《Java NIO》一...

    Java.nio

    Java.nio,全称为Java Non-blocking Input/...而压缩包中的"thread"、"noblock"、"block"可能分别对应于线程管理、非阻塞I/O和阻塞I/O的相关示例或讨论,进一步深入研究这些内容,有助于深化对Java.nio的理解和应用。

    Java NIO 电子书

    ### Java NIO 电子书知识点概述 #### 一、引言 **Java NIO (New Input/Output)** 是 Java 平台的一种新的输入输出处理方式,首次出现在 Java 1.4 版本中。它提供了比传统 Java IO 包更高效、更灵活的 API,特别是在...

    分布式Java中的TCP/IP+NIO

    接下来,我们讨论NIO(Non-blocking Input/Output),它是Java 1.4引入的一种新的I/O模型,与传统的阻塞I/O(BIO)相比,NIO具有更高的并发性能。在BIO中,每个连接都需要一个线程来处理,当连接数量增多时,线程...

    文件分割器(IO and NIO 两个版本)

    首先,我们来讨论基于Java IO的文件分割器。Java IO API是Java早期就引入的I/O处理机制,主要用于读写文件、处理流等操作。在这个版本中,文件分割器可能使用了`BufferedReader`或`DataInputStream`来读取源文件,...

    Java高级编程

    Java高级编程涵盖了许多关键主题,其中包括Java输入/输出(I/O)系统,非阻塞I/O(NIO),以及基于Java的Netty框架。这些领域是Java开发人员深入理解和优化应用程序性能的重要部分。 首先,Java I/O是Java平台的...

Global site tag (gtag.js) - Google Analytics