nio是new io的簡稱,從jdk1.4就被引入了。現在的jdk已經到了1.6了,可以說不是什麼新東西了。但其中的一些思想值得我來研究。這兩天,我研究了下其中的套接字部分,有一些心得,在此分享。
首先先分析下:為什麼要nio套接字?
nio的主要作用就是用來解決速度差異的。舉個例子:計算機處理的速度,和使用者按鍵盤的速度。這兩者的速度相差懸殊。如果按照經典的方法:乙個使用者設定乙個執行緒,專門等待使用者的輸入,無形中就造成了嚴重的資源浪費:每乙個執行緒都需要珍貴的cpu時間片,由於速度差異造成了在這個互動執行緒中的cpu都用來等待。
nio套接字是怎麼做到的?
其實,其中的思想很簡單:輪詢。乙個執行緒輪詢多個input;傳統的方式是:有n個客戶端就要有n個服務執行緒+乙個監聽執行緒,現在採取這種凡是,可以僅僅使用1個執行緒來代替n個服務執行緒以此來解決。
具體應用例子:
在ftp的控制連線中,因為只有少量的字元命令進行傳輸,所以可以考慮利用這種輪詢的方式實現,以節省資源。
具體見例子。
下面這個例子採取了nio方式實現,雖然還是有阻塞部分,但是與上乙個相比,效率已經大幅提高。僅僅阻塞到乙個監聽執行緒中。
:?:
IO與NIO的區別
一 實現方式 傳統io 1.傳統的socket io當客戶端和服務端連線成功後,服務端在進行讀取客戶端傳送的資訊的時候是通過新建執行緒來處理的,由此帶來了乙個問題,當有大量客戶端想服務端傳輸資料的時候,服務端就會啟動大量執行緒,這樣將大大的增加了伺服器的壓力。2.同時,傳統io通訊是阻塞的,即在讀取...
io與nio的區別
傳統的socket io中,需要為每個連線建立乙個執行緒,當併發的連線數量非常巨大時,執行緒所占用的棧記憶體和cpu執行緒切換的開銷將非常巨大。使用nio,不再需要為每個執行緒建立單獨的執行緒,可以用乙個含有限數量執行緒的執行緒池,甚至乙個執行緒來為任意數量的連線服務。由於執行緒數量小於連線數量,所...
NIO與IO讀檔案
對於讀檔案nio與io誰快?如果加一些複雜環境,然後再讓他們去讀檔案呢?為了得到這個答案,我做了兩組實驗,首先是直接單執行緒去讀乙個很大的檔案,分別通過nio和io去讀 nio 讀 param filename public static void readfilewithnio string fi...