由于前段时间的项目须要写一些高性能服务器,结果写出来的结果是五花八门,咱们要求使用NIO编写异步服务器,可是居然有人把NIO硬生生地写成同步的,还写成了一个单道批处理,线程调度、通讯、同步操做,尤如天马行空,看不出一点架构,典型的面条代码,极度晕倒,不得不下定决心,将IO部分与线程调度部分隔离出来。
为此,狠下心来,仔细研究了一下nio机制和dl的util.concurrent包。
1、NIO的出现
NIO是JDK1.4里面才出现的东东,他给你们带来的最大好处是异步socket。其它file,pipe暂时就很少谈了。
在JDK1.4出现以前,若是你须要编写一个Java服务器,为了实现异步操做,你必须为每一个链接请求生成一个Java线程,当链接请求不少时,线程的调度,上下文切换,所付出的代价是很是昂贵,并且因为Java是跨平台的,各个平台对线程的支持并不相同,性能也不相同,所以传统的Java服务器编程架构是低效的且代价贵,dl大侠写了个util.concurrent包后,总算是减轻了线程调度给java程序员带来的痛苦,可是相比之与C、C++写出来的服务器,java服务器在性能要求很高的状况下,基本上没有什么竞争力,甚至是入围的权利的都没有。
2、异步socket的实现
NIO出现后,好像让java的程序员有了杨眉吐气的机会,怎么个吐气法,当时你们是个什么感觉,俺是不知道,由于当时俺不搞java,对java的认识有限。
NIO是一个基于事件的IO架构,最基本的思想就是:有事件我通知你,你再去作你的事情,没事件时你大能够节约大把时间去作其它任何事情。并且NIO的主线程only one,不像传统的模型,须要N个线程去,也减轻了JVM的工做量,使得JVM处理任务时显得更加高效。
刚开始接触NIO时,被N层的Channel架构、网上铺天盖地的好评给镇住了,想一想也应当是个很成熟的产品了,网上资料这么多,抄一抄Jetty、Tomcat以及其它一些牛B的源代码,基本上就能搞定了,此时没有想到你们受同步的影响这么深,也没有想到连最基本的异步概念都没有搞清楚就去写代码,搞出一堆的问题来(这是后话,后面再说)。
如今研究了NIO之后,发现NIO实际上在Java中作的工做是很简单,就是将事件进行收集和分发,咱们结合一个经典的调用例子来讲明这个问题,我就不从NIO的基本使用提及了,你们能够查其它的资料,网上一大把。
当Channel注册至Selector之后,咱们的最经典的调用方法,是这样子的。html