由於前段時間的項目須要寫一些高性能服務器,結果寫出來的結果是五花八門,咱們要求使用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