java nio 学习

看完以后,发现这篇文章虽然写的时间较早,但是我这几天看到的给我启发最大的一篇资料。

我下载文章下面附带的源代码,看了几遍,我的思路忽然开朗起来。

重新改写之前几天写的代码,经过这一天的努力,写出的代码经过测试,不管是并发性、处理能力方面都有明显的提升。

与 以前用传统的io + socket + 多线程写的HTTP服务器对比,用ab测试并发性,nio 处理 2000 并发一点儿问题都没有,反应的速度也相当的快,而传统的io处理方式在处理1000个并发的过程中,客户端ab就崩溃了,NIO与传统的IO测试对比结 果:

传统的IO + socket需要几百、上千个线程来处理客户端的请求,而 NIO 只需要几个线程就搞定;

NIO内存占用相比传统的IO降低 80%;

NIO的cpu占用相比传统的IO 降低 20%;

NIO处理能力相比传统的IO 却提升了 30%;

我今天使用NIO写的代码结构相当简单:

1个 Selector 主线程 + 1个 Reader 线程 + 1个 Writer 线程

就能处理几百、上千的并发请求,处理的速度相当的快,内存占用相当的低。

看到测试的结果,我也深刻体会到了nio的一个优点:该read的时候再read,该write时候再write。

不像传统的io,用多个线程处理多个用户的多个连接请求,不管用户提交的数据是否到达,先 read(),没有数据可读的时候,就在那阻塞着。

不过话又说回来,传统的io,基于流(Stream),也有它的优点,比如处理流程简单,代码写起来相比nio要简单许多。

 

在这里我还想说一点体会,就是我在网上这几天找相关资料,发现80%的文章介绍的都不够深入,提供的代码基本上都是单线程的,非常适合用来处理短连接,这也一直给我一种错觉,难道NIO不适合处理长连接?

今天找到的这篇:http://www.ibm.com/developerworks/cn/java/l-niosvr/

查看了文章里提供的源代码,使用了三个线程(Selection线程,Reader线程,Write线程),使nio处理长连接成为可能,只需简单修改一下,就OK了。

猜你喜欢

转载自san-yun.iteye.com/blog/1665405
今日推荐