为什么使用Java NIO

7 三月, 2010 (00:08) | 代码 繁体 English    DeliciOus    分享到新浪微博
作者: H.E. | 您可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.javabloger.com/article/why-use-java-nio.html
豆瓣读书 向你推荐有关 代码、 类别的图书。

Java中普通的I/O功能  一般体现在 1.文件读写、2.网络传输、3.字节流输入/输出  应用场景。而Java中的 NIO 提高了原有I/O的性能。

Java的NIO包含以下特性:
  1.内存映射到文件
  2.文件锁定
  3.字符集编码和锁码
  4.非阻塞的输入/输出

 Java的NIO目前运用最广泛的在Apache的Tomcat6中,1.减少了服务器在瞬间达到峰值的现象,2.减少了服务器线程不必要的开销。
ps: 1.Tomcat5.X的版本中还不支持NIO。2.Tomcat 6中默认的配置并不支持NIO,需要进行配置,详见我写的另外一篇文章“给正在使用Tomcat6的朋友说几句废话(优化)” ,原文地址: http://www.javabloger.com/article/performance_tomcat_about_nio.html

从下面2图中就可以看出Java中普通的I/O和Java中NIO的区别

Java传统I/O在socket编程中的应用场景,如图所示:

http://www.javabloger.com/images/article_pic/java.nio.00.jpg

一个socket连接对应一个输入/输出通道,一个输入/输出通道在对应一个线程,这样有多个请求,就需要开辟多个线程,这样对CPU的负担大大的提高。关系是一对一的。

Java NIO 在socket编程中的应用场景,如图所示:

http://www.javabloger.com/images/article_pic/java.nio.01.jpg

在上图中我们能看到中间有类叫做Selector
1.当socket服务端启动后对每个socketchannel进行建立关系。
2.这时只需要把探知的socketchannel告诉Selector。
3.当有事件发生时,会通知传回一组SelectionKey,读取这些Key,就会获得我们刚刚注册过的socketchannel。
4.原先已经建立好的Channel中读取数据。
5.最后可以接收到的这些数据进行处理。

所以我们能看出不必像原先那样开大量的线程,然后让线程傻傻的等待。而NIO不必,通道已经由一个线程建立好了,有事就说话,说了就去做,而且在一个线程中建立了多个通道,可以同时做很多事情,不会像原先那样开辟多个线程,耗费CPU资源,关系是1对多的。

–end–

豆瓣读书  向你推荐有关 代码、 类别的图书。



Creative Commons License
本文由J2ee企业顾问-黄毅创作,并已采用创作共用署名2.5中国大陆版许可证授权。

评论

Comment from icantellu
Time 2010年04月14日 at 5:51 下午

将传统的IO 转向 Non-Blocking IO 的目的 有以下的原因
1.Typical IO 的Stream方式 处理速度缓慢 而 Non-Blocking 是以block方式
2. Non-Blocking IO 使用到了 buffer

其实我的疑问在于
Typical IO 频繁创建线程 虽然消耗系统资源 但是处理速度快
而 Non-Blocking IO 是单线程 处理速度应该会慢不少吧

Comment from wahah
Time 2010年06月4日 at 11:12 上午

好文,转载搜藏了

评论

评论也是有版权的!




6997